sedを使用して単語全体を見つけて置き換えます。

sedを使用して単語全体を見つけて置き換えます。

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

test3.legacy test4.legacy test3 test3.kami

test3ただ全体的に検索して何でも交換したいです。残念ながら、すべての試みが削除されました。テスト3test3.legacytest3.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'

重複一致を処理します。あるいは、人が複数のスペースなどを処理することもできます。入力によって異なります。

オーフード


あるいは、おそらく(ただ出発点に):

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まず、行の先頭と末尾にスペースを追加することで、行の始めと終わりを心配する必要はありません。
  • スペース内のコンテンツをtest31つのスペースに置き換え、
  • 代替品がある限り、test3 test3プロセスが繰り返されます(状況を処理するため)。
  • 最初に追加した先行スペースと末尾のスペースを削除します。

答え4

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

上記の方法を試してください。

関連情報