![使用 sed 查找整個單字並替換](https://rvso.com/image/31683/%E4%BD%BF%E7%94%A8%20sed%20%E6%9F%A5%E6%89%BE%E6%95%B4%E5%80%8B%E5%96%AE%E5%AD%97%E4%B8%A6%E6%9B%BF%E6%8F%9B.png)
我的文件中有以下文字區塊:
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
給定您的範例,我會尋找兩側用空格包裹的 test3,\s
而不是嘗試使用單字邊界符號。
例如
$ 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
為單一空格, - 只要有替換(以覆蓋情況
test3 test3
),就重複此過程。 - 刪除我們最初新增的前導和尾隨空格。
答案4
sed -e 's/ test3 / /g' -e 's/ test3//g' -e 's/test3 //g' myfile.txt
請嘗試以上