文字列から単語の特定のインスタンスを分離します。

文字列から単語の特定のインスタンスを分離します。

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;untested2番目の項目だけが前後に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に特に感謝します。]

ハイライトに似たものが欲しいなら、ここに簡単なアイデアがあります。パールモンクスgrepPerl / Rakuを使用し、カラーオプションの代わりにアスタリスクで一致を囲みます**

afterRaku注: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

関連情報