sedを使用して単語全体を検索し、置換する

sedを使用して単語全体を検索し、置換する

ファイル内に次のテキスト ブロックがあります。

test3.legacy test4.legacy test3 test3.kami

test3全体を検索して何も置き換えたくないのですが、残念ながらすべての試みで削除されてしまいましたテスト3から。私はtest3.legacy以下test3.kamiを試しました:

sed 's/^test3://g' myfile.txt
sed 's/\btest3\b//g' myfile.txt
sed 's/\<test3\>//g' myfile.txt

運がありませんでした。これを解決する方法はありますか?

編集:ほとんどの試みの結果は次のようになりました。.legacy test4.legacy .kami

答え1

これは、あなたの望むことですか?

$ sed 's/\(^\| \)test3\( \|$\)/\1/g' file
test3.legacy test4.legacy test3.kami

これは言う

substitute
   (^ start of line OR space)
   test3
   (space OR end of line)
with match 1 (AKA space or start of line)

アップデート:

そして、善良な人が優雅に言ったように@ステファン・シャゼラスこれは特定のケースには対応できません。また、移植性の部分も重視してください。下記に回答

GNUの変種は、(うまくいけば)、 なれ:

sed 's/\(^\| \)\(test3\( \|$\)\)*/\1/g'
# Or perhaps:
sed 's/\(^\| \)\(test3\( \|$\)\)\+/\1/g'

繰り返しの一致を処理します。オプションで、複数のスペースなども処理します。入力によって異なります。

EOUPD


代替案としては(あくまでも出発点として):

sed 's/\Wtest3\W/ /g'

これはそうではないと思います:

$ sed 's/test3\.\?[^ ]* *//g' file
test4.legacy

答え2

\sあなたの例を参考にして、単語境界表記を使用するのではなく、両側にスペースで囲まれた test3 を探します。

例えば

$ echo "test3.legacy test4.legacy test3 test3.kami" | sed 's/\stest3\s/ /g'
test3.legacy test4.legacy test3.kami

上記は空間テスト3空間これを空間

注記:これでは、test3 がリストの最初にある状況は処理されません。

答え3

ポータブル:

sed -e 's/.*/ & /' -e :1 -e 's/ test3 / /g;t1' -e 's/^ //;s/ $//'

あれは:

  • まず行の先頭と末尾にスペースを追加して、test3先頭と末尾を特別に考慮する必要がないようにする。
  • test3スペースで囲まれた部分を1つのスペースに置き換えます。
  • 置換がある限り(test3 test3ケースをカバーするために)このプロセスを繰り返します。
  • 最初に追加した先頭と末尾のスペースを削除します。

答え4

sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt

上記をお試しください

関連情報