grep
文字列を処理するコマンドがあります
test-test test
test
コマンドが強調表示された「independent」という単語だけを表示したいと思いますtest-test
。
しかし、私が走るとき
echo "test-test test" | grep -w "test"
私はtest
起こったすべてのことを強調しました。
孤立した発生にのみ一致を制限できますかtest
?
答え1
単語は、英数字や下線など、単語ではなく文字で区切られた一連の単語文字であるため、すべてのtest
項目が太字で表示されます。単語文字ではありません。-w
-
では、testing-test+test2;test_3;untested
2番目の項目だけが前後にtest
単語文字がないため、一致します。
スペースで区切られた単語を一致させるには、次のように指定する必要があります。周りを見てくださいgrep
手動アサーションとすべての実装がサポートしていない機能には、Perl準拠の正規表現が必要です。grep='grep --color
エイリアスがあるようです/オプションをサポートしているgrep
場合は、--color
そのオプションもサポートできます。これにより、次のことができます。-P
-X perl
grep --color -P '(?<!\S)test(?!\S)'
(?<!...)
そして(?!...)
それぞれPerl正規表現の不正な振り返りとプレビューアサーション演算子。 、POSIX一致、空白以外の文字\S
と同じです。[^[:space:]]
つまり、「test
空白以外の文字が前後にない限り一致します」
答え2
Perl正規表現(-P
フラグでGNU grepでサポートされています)を使用すると、ネガティブな振り返りとプレビューを使用して、隣接していないtest
一致を主張できます-
。
echo "test-test test" | grep -P '(?<!-)test(?!-)'
この出力
試験を受けるテスト
答え3
拡張正規表現を使用すると、次のように実装できます。
grep -E "(^| )test( |$)"
これは実際には先行スペースまたはトレーニングスペースを強調表示しますが、印刷可能な文字ではないため表示されません。
答え4
使用真珠:
~$ echo "test-test test\ntest\n\n" | perl -lpe 's/(?<!\S)(test)(?!\S)/**$1**/g;'
test-test **test**
**test**
使用幸せ:
~$ echo "test-test test\ntest\n\n" | raku -pe 's:g/ <!after \S > (test) <!before \S > /**$0**/;'
test-test **test**
**test**
[回答grep
でPerlスタイルのLookaroundについて詳しく説明した@StéphaneChazelasに特に感謝します。]
ハイライトに似たものが欲しいなら、ここに簡単なアイデアがあります。パールモンクス。grep
Perl / Rakuを使用し、カラーオプションの代わりにアスタリスクで一致を囲みます**
。
after
Raku注:Rakuでは、Lookbehindsのスペルは肯定的で否定的です?
が、LookaheadsのスペルはRakuの肯定的で否定的です!
。したがって、上記のRakuコードを直接読むことができます。before
?
!
after
「空白以外の文字や空白以外の文字ではない「テスト」という単語の発生をグローバルに置き換えますbefore
...」。
https://perldoc.perl.org/perlre#Lookaround-Assertions
https://docs.raku.org/言語/regexes#Lookahead_assertions
https://docs.raku.org/言語/regexes#Lookbehind_assertions