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

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

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

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

grep -P '[\p{Han}]' filename.txt

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

grep '###' filename.txt

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

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

哦,万一有帮助,如果文件包含

中文 keep this line
### keep this line
don't keep this line

它应该输出

中文 keep this line
### keep this line

答案1

一般来说,您可以使用 组合多个模式-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

因此,您需要将替换放在正则表达式中:

grep -P -e '[\p{Han}]|###' filename.txt

要不就

grep -P '\p{Han}|###' filename.txt

-e在单个模式的情况下, 是可选的,并且您不需要使用括号表达式,[ ]除非您有要匹配的字符或属性)。


或者,您可能更喜欢直接使用 Perl 的正则表达式,例如。

perl -CDS -ne 'print if /\p{Han}/ or /###/' filename.txt

答案2

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

rg -N -e '[\p{Han}]' -e '###' filename.txt

答案3

使用(以前称为 Perl_6)

如果您只想包含Han脚本的行,则grep对于包含<:Script<Han>>字符的行。使用|提供与其他正则表达式模式的交替:

raku -ne '.put if .grep( / <:Script<Han>>  |  \#**3 / );' 

或者

raku -ne '.put if .grep( / <:Script<Han>> / | / \#**3 / );' 

或者

raku -ne '.put if .grep( / <:Script<Han>> / ) | .grep( / \#**3 / );' 

输入示例:

中文 keep this line
### keep this line
don't keep this line

示例输出(所有 3 个代码示例):

中文 keep this line
### keep this line

关于 Raku 正则表达式中转义字符的简短说明:

基本上,所有非alnum字符都必须被引用或转义以保留其字面含义。未加引号或未转义的字符被认为具有特殊含义(例如,.未转义点表示任何字符,但\.转义点表示字面点字符)。

无论未转义的非字符是否具有指定的正则表达式含义,此规则都适用alnum- 有效地保留整个字符类以供将来的正则表达式改进。

https://raku.org

相关内容