如何查找以**开头的行


8

我需要查找文件中是否有任何行以开头**

我不知道该怎么做,因为它*被外壳解释为通配符。

grep -i "^2" test.out

如果行以2开头但有效

grep -i "^**" test.out 

显然是行不通的。

(我还需要知道该行是否以a结尾,)但尚未尝试过)。

Answers:


18

使用\字符转义*使其成为普通字符。

grep '^\*\*' test.out

还要注意单引号'而不是双引号,"以防止外壳扩展内容


3
*在这种特殊情况下,第一个不需要转义。
don_crissti

5
尽管不必逃避,但不经意的观察者不逃避第一个星号会更加令人困惑,就像您要匹配“任意数量的行首,后跟一个星号”。使正则表达式对维护人员更加直观的任何事情都是一个好主意。=)
杰出的编译器

1
使用双引号还会阻止扩展,而不仅是单引号。错误的建议在这里。
rems4e

@ rems4e使用双引号可以防止外壳扩展星号,但不能解释反斜杠。如果使用双引号,则必须使用grep "^\\*\\*"grep来接收^\*\*它需要避免将星号解释为正则表达式量词的字符串。
亚伦

7

您想检查以开头**和以结尾的行),可以将两个grep操作结合在一起,

grep '^*\*' test.out | grep ')$'

grep像这样的单个命令,

grep -E '^\*\*.*\)$' test.out

说明

  • ^\*\* :以以下开头的匹配行 **
  • .* :匹配之后的所有内容 **
  • \)$:匹配行,该行也)位于行尾。

3

不是贝壳

到目前为止,没有任何答案涉及真正的问题。解释为什么它无法按预期工作将很有帮助。

grep -i "^**" test.out

因为你引述的模式的grep*不是由shell扩展。它按原样传递给grep。这在手动页面说明[1]bash的[2]

用双引号引起来的字符将保留引号中所有字符的文字值,但$,`,\除外,并且在启用历史记录扩展功能时,!。

它是正则普通正则表达式

正则表达式是一个图案描述一组串。

*是正则表达式中的关键模式之一。默认情况下,grep对其解释如下:

* The preceding item will be matched zero or more times.

这意味着您的模式^**没有任何意义。可能会尝试将行的开头匹配零次或多次,两次。不管它是什么意思。

解决方案是引用它:

任何具有特殊含义的元字符都可以在其前面加上反斜杠来引用。

grep -i "^\*\*" test.out


[1]我不建议阅读。请改用man dash或类似名称。

[2]没有给出外壳,所以我假设为bash


2

其他选项。

您可以使用sedawk

$ sed -n '/^*\*/p' test.out
$ awk '/^*\*/' test.out

要知道行为此与)使用还grepsedawk

$ grep ')$' test.out
$ sed -n '/)$/p' test.out
$ awk '/)$/' test.out

谢谢大家 !我真的很感谢这方面的帮助!
Shar Hunter

1
和组合的awk行:'/^*\*/&&/)$/'...
jasonwryan

0

这是完全未引用的版本:grep ^\\*\\* test.out。要将文字反斜杠从shell传递到grep,需要对其进行转义。

只要目录中没有以^\反斜杠开头且包含反斜杠的文件,此方法就起作用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.