Reb*_*nes 4 grep text-processing
我有一个文本文件,我想使用 Unix 命令(我不关心哪个)来打印包含中文字符或包含字符串 ### 的行。
\n这个答案有一个 grep 命令,可以打印出包含汉字的行
\ngrep -P \'[\\p{Han}]\' filename.txt\n
Run Code Online (Sandbox Code Playgroud)\n我理解这是一个 Perl 正则表达式。这会打印出包含 ### 的行:
\ngrep \'###\' filename.txt\n
Run Code Online (Sandbox Code Playgroud)\n但我不知道如何组合(或)它们。如果我grep -e \'###\' -P \'[\\p{Han}]\'
按照我的预期,这个答案会概括,它不会打印出包含汉字的行。
问题:如何使用 Unix 命令打印包含汉字的行或包含 ### 的行?
\n哦,万一有帮助,如果文件包含
\n\xe4\xb8\xad\xe6\x96\x87 keep this line\n### keep this line\ndon\'t keep this line\n
Run Code Online (Sandbox Code Playgroud)\n它应该输出
\n\xe4\xb8\xad\xe6\x96\x87 keep this line\n### keep this line\n
Run Code Online (Sandbox Code Playgroud)\n
ste*_*ver 14
一般来说,您可以使用 组合多个模式-e pat1 -e pat2
,但至少对于 GNU grep 3.4 版,全局-P
选项仅允许单个模式:
$ grep -P -e '[\p{Han}]' -e '###' filename.txt
grep: the -P option only supports a single pattern
Run Code Online (Sandbox Code Playgroud)
因此,您需要将替换放在正则表达式中:
grep -P -e '[\p{Han}]|###' filename.txt
Run Code Online (Sandbox Code Playgroud)
要不就
grep -P '\p{Han}|###' filename.txt
Run Code Online (Sandbox Code Playgroud)
(-e
在单个模式的情况下, 是可选的,并且不需要使用括号表达式,[ ]
除非您有一组字符或属性要匹配)。
或者,您可能更喜欢直接使用 Perl 的正则表达式,例如。
perl -CDS -ne 'print if /\p{Han}/ or /###/' filename.txt
Run Code Online (Sandbox Code Playgroud)
当您使用该选项时,GNU grep 不支持多种模式-P
(除非以 Steeldriver 建议的方式),但ripgrep支持多种模式(并且已经启用了扩展正则表达式):
rg -N -e '[\p{Han}]' -e '###' filename.txt
Run Code Online (Sandbox Code Playgroud)