如何搜尋、取代模式並將其附加到每行末尾

如何搜尋、取代模式並將其附加到每行末尾

我有以下項目清單:

bigBone
fishMarket
dogCollar
...

我需要產生這樣的兩個字元映射:

bigBone -> bb
fishMarket -> fm
dogCollar -> dc
...

如何使用建立上述映射sed

我嘗試過類似的事情:

sed -i -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/' file

我看見這個問題,但不確定如何在這裡合併這個概念。謝謝。

答案1

如果我理解正確的話,那麼你想保留整行並添加一些內容:

sed -r 's/^([a-z]{1})([a-z]+)([A-Z]{1})([a-zA-Z]+)$/\1\2\3\4 -> \1\L\3/' file

編輯:

devnull 不得不提醒我,有一個簡單的解決方案:

sed -r 's/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/& -> \1\L\2/' file

或者,更優雅一點(比我第一次嘗試):

sed -r '
h
s/^([a-z]{1})[a-z]+([A-Z]{1})[a-zA-Z]+/ -> \1\L\2/
t append
b
: append
H
g
s/\n//' file

答案2

使用 GNU sed:

sed -r 's/(.)[^[:upper:]]*(.).*/& -> \1\L\2/' inputfile

對於您的輸入,它會產生:

bigBone -> bb
fishMarket -> fm
dogCollar -> dc

答案3

用 GNU推廣到fooBarBaz -> fbb, , :abCdEfGh -> acegsed

sed -r 's/(.)(.*)/\1\n\2 -> \L\1/;:1
        s/\n([^[:upper:]]*([[:upper:]]))(.*)/\1\n\3\L\2/;t1;s/\n//'

POSIXsed沒有\L.因此,為了方便移植,您必須使用y並手動輸入要轉換為小寫的所有字元。就像是:

LC_ALL=C sed '/^\([[:alpha:]]\).*/{
h;s//\1/;y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/\(.\).\(.\)\(.*\)/\2\
\3 -> \1/;:1
/.*\n[^A-Z]*\([A-Z]\).*/{h;s//\1/
y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/;G
s/^\(.\)\n\(.*\)\n\([^A-Z]*[A-Z]\)\(.*\)/\2\3\
\4\1/;t1
}
s/\n//;}'

答案4

這個答案與@devnull的類似,

$ sed 's/\(.\).*\([A-Z]\).*/& -> \1\L\2/g' file
bigBone -> bb
fishMarket -> fm
dogCollar -> dc

相關內容