在以下示例中:
echo "manoeuvre man track" | awk -v replace="man" '{ gsub(replace, ""); print }'
我得到這個結果:
oeuvre track
我希望它僅在找到整個單詞時才替換文本,因此,我會得到:
manoeuvre track
(只去掉了man這個詞)
--
我用單詞邊界(\b 和 \y)嘗試了這個,但我不明白如何在這里應用它們。
我使它與 for 回圈一起作業,但我想也許有一種使用 gsub 的更直接的方法?
我只有AWK,沒有gAWK。
# awk --version
awk version 20200816
uj5u.com熱心網友回復:
這可能是您嘗試使用任何 awk 執行的操作,假設您想要第一個全欄位文字字串匹配:
$ echo "manoeuvre man track" |
awk -v replace="man" '
s=index(" "$0" "," "replace" ") {
$0 = substr($0,1,s-2) substr($0,s length(replace))
}
{ print }
'
manoeuvre track
或者,如果您想對所有欄位進行全欄位正則運算式匹配:
$ echo "manoeuvre man track" |
awk -v replace="man" '
{
$0=" "$0" "
gsub(" "replace" "," ")
gsub(/^ | $/,"",$0)
print
}
'
manoeuvre track
還有很多其他的可能性...
uj5u.com熱心網友回復:
以Ed 的解決方案為基礎,解決多個相鄰出現的搜索詞:
cat file
manoeuvre man man man mantrack man
awk -v replace="man" '
{
$0 = " " $0 " " # pad space on each side of the line
gsub("( " replace ") ", " ") # replace 1 repetitions of man with a space
gsub(/^ | $/, "") # remove space from both sides of the line
}
1' file
manoeuvre mantrack
uj5u.com熱心網友回復:
“Vanilla”awk 不適合這項任務。我會使用 perl:
$ echo "manoeuvre man track" |perl -pe 's/\bman\b//g'
manoeuvre track
或者如果您想將“man”作為引數傳遞:
$ echo "manoeuvre man track" |perl -spe 's/\b${word}\b//g' -- -word=man
manoeuvre track
最后一點:如果您希望將“單詞”視為文字字串,請使用\Q...\E正則運算式標記:
$ echo "manoeuvre man m.n trackm.n" |perl -spe 's/\b${word}\b//g' -- -word=m.n
manoeuvre trackm.n
$ echo "manoeuvre man m.n trackm.n" |perl -spe 's/\b\Q${word}\E\b//g' -- -word=m.n
manoeuvre man trackm.n
uj5u.com熱心網友回復:
由于您不能使用 GNU awk,因此您不能使用單詞邊界。你需要一個工具來做。例如,Perl。
如果您可以使用 Perl,您可以使用Glenn's one 之類的解決方案,但我會使用一種經過修改的方法:
#!/bin/bash
text="manoeuvre man man trackman"
replace="man"
perl -spe 's/\s*(?!\B\w)\Q${replace}\E(?<!\w\B)//g' -- -replace="$replace" <<< "$text"
## => manoeuvre trackman
請參閱此在線演示。
詳情:
s- 允許使用自定義開關p- 逐行讀取檔案e- 表示選項結束,接下來是命令\s*(?!\B\w)\Q${replace}\E(?<!\w\B)- 匹配的正則運算式\s*- 一個或多個空格(?!\B\w)- 左手自適應動態詞邊界\Q${replace}\E- 一個replace“單詞”(可以是具有任何特殊和非特殊字符的任何字串)其中\Q并\E自動參考(轉義)所有特殊正則運算式元字符(因為它們被視為文字字符)(?<!\w\B)- 右手自適應動態詞邊界。
請注意,當您不知道傳遞給正則運算式模式的“單詞”是否以特殊(即“非單詞”)字符開頭或結尾時,自適應單詞邊界將最有效。
如果你有一個 GNUawk,你可以使用類似的東西:
awk -v replace="man" '{gsub("\\<"replace"\\>", "")}1'
查看在線演示:
#!/bin/bash
s="manoeuvre man track"
awk -v replace="man" '{gsub("\\<"replace"\\>", "")}1' <<< "$s"
# => manoeuvre track
注意:
- 這里的單詞邊界是
\<and\>,并且要在命令中使用文字\字符awk,它需要加倍 replace\<是一個僅包含單詞字符的變數,因此可以使用\>單詞邊界來包裝此值以匹配整個單詞(如果它包含非單詞字符會更復雜)- 要從變數創建模式,您需要連接這些值,這里使用
"\\<"replace"\\>". - 請注意,在上面的代碼
print中替換為。1
uj5u.com熱心網友回復:
最壞的情況,手動破解可能發生的事件 -
$: echo "man - manual man is really manners man" |
awk -v replace="man" '{
gsub("^"replace"[[:space:]] ","");
gsub("[[:space:]] "replace"$","");
gsub("[[:space:]] "replace"[[:space:]] "," ");
} 1'
- manual is really manners
如果你愿意嘗試sed——
$: echo "man - manual man is really manners man" | sed -E 's/\<man\>/ /g; s/ / /g;'
- manual is really manners
如果您有 GNU awk,并且可能不關心使用文字空格字符 -
$: echo "man - manual man is really manners man" | awk '{gsub("\\<man\\>",""); gsub(" "," ");}1'
- manual is really manners
如果您不關心雙空格-
$: echo "manual man has manners" | sed -E 's/\<man\>//g'
manual has manners
$: echo "manual man has manners" | awk '{gsub("\\<man\\>","")}1'
manual has manners
如果您真的想在命令列上將模式作為變數提供,請注意雙重決議。如果您使用單引號,您仍然需要雙反斜杠參考,如果您使用雙引號,則需要四個...
$: echo "manual man has manners" | awk -v replace='\\<man\\>' '{gsub(replace,""); gsub("[[:space:]][[:space:]] "," ");}1'
manual has manners
$: echo "manual man has manners" | awk -v replace="\\\\<man\\\\>" '{gsub(replace,""); gsub("[[:space:]][[:space:]] "," ");}1'
manual has manners
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/453370.html
上一篇:如何在回圈中使用sed?
下一篇:什么是參考命令?
