在使用grep进行搜索时,如何仅匹配以a-z,A-Z,空格或行首开头的项目?

时间:2014-08-20 05:48:24

标签: regex bash grep

我需要显示file.txt中包含字符“鱼”的所有行,但只显示“鱼”前面有a-zA-Z,空格或换行。

我尝试使用grep,如下所示:

grep "[a-zA-Z\s\n]鱼" file.txt

正则表达式[a-zA-Z\s\n]似乎不起作用。在a-zA-Z,空格或换行符之后显示时,如何搜索此字符?

4 个答案:

答案 0 :(得分:5)

如果要将空格与grep匹配,请使用空格:

grep "[a-zA-Z ]鱼" file.txt

如果要匹配任何空格,可以使用Posix标准字符类:

grep "[a-zA-Z[:space:]]鱼" file.txt

(&#34;任何空白&#34;是空格,换行符,回车符,换页符,制表符和垂直制表符。如果您只想匹配空格和制表符,可以使用[:blank:]。)< / p>

您可能还想使用标准类来表示字母。除非你在Posix或&#34; C&#34;在语言环境中,A-Z等字符范围的含义是不可预测的。

grep "[[:alpha:][:space:]]鱼" file.txt

grep逐行工作,因此永远不会看到换行符。但使用&#34;扩展&#34;模式,你也可以在行的开头匹配:

egrep "(^|[[:alpha:][:space:]])鱼" file.txt

(如果您愿意,可以使用grep -E代替egrep。但是您需要使用其中一个才能使上述正则表达式正常工作。)

答案 1 :(得分:1)

Grep默认不支持此功能

$ man grep | grep '\\s'

但是awk确实

$ man awk | grep '\\s'
       \s         Matches any whitespace character.

所以也许使用

awk '/[a-zA-Z\s\n]鱼/' file.txt

答案 2 :(得分:1)

使用awk

awk '/[A-Za-z \t]鱼/ || (NR > 1 && /^鱼/)' file

如果位于[A-Za-z \t]后面,或者如果它不在第一行,并且它位于该行的开头,则会打印哪一行:NR > 1 && /^鱼/

如果您真的希望它在开始时或后面跟​​[A-Za-z \t],您可以这样做:

awk '/(^|[A-Za-z \t])鱼/' file

或者

grep -E '/(^|[A-Za-z \t])鱼/' file

答案 3 :(得分:1)

试试这个:

^[a-zA-Z \n]{1,}鱼

{1,}将确保至少获得其中一个元素

我建议在这个特殊情况下使用awk