ファイル内に次のテキスト ブロックがあります。
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
上記をお試しください