Text-Processing

替換括號之間的文本

  • October 25, 2012

awk '{ gsub(/BAR|WIBBLE/, "FOO"); print }'用來替換數據中的文本,例如:

SOMETHING [BAR, WIBBLE]
SOMETHING [BAR]

這給出了所需的結果:

SOMETHING [FOO, FOO]
SOMETHING [FOO]

但現在我不得不將需要替換的文本更新為:

awk '{ gsub(/BAR|WIBBLE|ME/, "FOO"); print }'

它將文本變為:

SOMETHING [ME, WIBBLE]

進入:

SOFOOTHING [FOO, FOO]

如何將我的替換限制為括號之間的文本(即不理會SOMETHING)?

編輯

我還需要對任何文本都具有強韌性SOMETHING(例如SHE GAVE ME THAT不應該ME被替換)。

一定是這樣awk嗎?在替換的替換部分可以是函式呼叫的其他語言中要容易得多。例如perl

perl -pe 'sub c{$s=shift;$s=~s/BAR|WIBBLE|ME/FOO/g;$s}s/\[.*?\]/c$&/ge' 

使用 GNU awk,您可以設置RS括號的內容,然後在RT(匹配的記錄分隔符)上進行替換:

awk -v RS='\\[[^]]*\\]' '{ gsub(/\<(BAR|WIBBLE|ME)\>/, "FOO", RT); printf "%s%s", $0, RT }' infile

文件:

cat << EOF > infile
SHE GAVE ME THAT
SOMETHING [ME, WIBBLE, SOMMER]
EOF

輸出:

SHE GAVE ME THAT
SOMETHING [FOO, FOO, SOMMER]

引用自:https://unix.stackexchange.com/questions/52793