テキストファイルがあり、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を使用して複数のパターンを組み合わせることができますが、少なくとも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
、今後正規表現改善のために全文字クラスを効果的に保存します。