我有一个文本文件,我想使用 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
- 有效地保留整个字符类以供将来的正则表达式改进。