Bash
sed:修改文本中每個單詞的每個非第一個單詞重複
我需要使用 sed 做類似的事情嗎?
qq ab xyz ab qq aa ab
變成:
qq ab xyz +ab+ +qq+ aa +ab+
如果您的輸入不包含
<
,>
也不包含+
字元,您可以這樣做:sed ' s/[[:alnum:]]\{1,\}/<&>/g;:1 s/\(<\([^>]*\)>.*\)<\2>/\1+\2+/;t1 s/[<>]//g'
如果可能的話,你總是可以逃避它們:
sed ' s/:/::/g;s/</:{/g;s/>/:}/g s/[[:alnum:]]\{1,\}/<&>/g;:1 s/\(<\([^>]*\)>.*\)<\2>/\1+\2+/;t1 s/[<>]//g s/:}/>/g;s/:{/</g;s/::/:/g'
那些假設你想在每一行上獨立地做到這一點。如果要對整個文件執行此操作,則需要先將整個文件載入到記憶體中(請注意,某些
sed
實現在那裡有大小限制):sed ' :2 $!{N;b2 } s/:/::/g;s/</:{/g;s/>/:}/g s/[[:alnum:]]\{1,\}/<&>/g;:1 s/\(<\([^>]*\)>.*\)<\2>/\1+\2+/;t1 s/[<>]//g s/:}/>/g;s/:{/</g;s/::/:/g'
不過,這將是非常低效的,並且會更容易
perl
:perl -pe 's/\w+/$seen{$&}++ ? "+$&+" : $&/ge'
基於行:
perl -pe 'my %seen;s/\w+/$seen{$&}++ ? "+$&+" : $&/ge'