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 pat2GNU grepバージョン3.4を使用して複数のパターンを組み合わせることができますが、少なくとも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が提案する方法を除く)。リップグレップ複数のパターンがサポートされています(拡張正規表現が有効になっています)。

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

関連情報