各行の末尾にパターンを検索、置換、追加する方法

各行の末尾にパターンを検索、置換、追加する方法

以下のアイテムのリストがあります:

bigBone
fishMarket
dogCollar
...

次のような 2 文字のマッピングを生成する必要があります。

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

関連情報