私のファイルには次のテキストブロックがあります。
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'
重複一致を処理します。あるいは、人が複数のスペースなどを処理することもできます。入力によって異なります。
オーフード
あるいは、おそらく(ただ出発点に):
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
上記の方法を試してください。