Bash

sed:修改文本中每個單詞的每個非第一個單詞重複

  • November 25, 2018

我需要使用 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'

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