如何使用 Unix 命令打印包含汉字的行或包含 ### 的行?

Reb*_*nes 4 grep text-processing

我有一个文本文件,我想使用 Unix 命令(我不关心哪个)来打印包含中文字符或包含字符串 ### 的行。

\n

这个答案有一个 grep 命令,可以打印出包含汉字的行

\n
grep -P \'[\\p{Han}]\' filename.txt\n
Run Code Online (Sandbox Code Playgroud)\n

我理解这是一个 Perl 正则表达式。这会打印出包含 ### 的行:

\n
grep \'###\' filename.txt\n
Run Code Online (Sandbox Code Playgroud)\n

但我不知道如何组合(或)它们。如果我grep -e \'###\' -P \'[\\p{Han}]\'按照我的预期,这个答案会概括,它不会打印出包含汉字的行。

\n

问题:如何使用 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)


fra*_*ous 5

当您使用该选项时,GNU grep 不支持多种模式-P(除非以 Steeldriver 建议的方式),但ripgrep支持多种模式(并且已经启用了扩展正则表达式):

rg -N -e '[\p{Han}]' -e '###' filename.txt
Run Code Online (Sandbox Code Playgroud)