我需要显示file.txt
中包含字符“鱼”的所有行,但只显示“鱼”前面有a-z
,A-Z
,空格或换行。
我尝试使用grep
,如下所示:
grep "[a-zA-Z\s\n]鱼" file.txt
正则表达式[a-zA-Z\s\n]
似乎不起作用。在a-z
,A-Z
,空格或换行符之后显示时,如何搜索此字符?
答案 0 :(得分:5)
如果要将空格与grep匹配,请使用空格:
grep "[a-zA-Z ]鱼" file.txt
如果要匹配任何空格,可以使用Posix标准字符类:
grep "[a-zA-Z[:space:]]鱼" file.txt
("任何空白"是空格,换行符,回车符,换页符,制表符和垂直制表符。如果您只想匹配空格和制表符,可以使用[: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