以下の項目のリストがあります。
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 -> aceg
sed
sed -r 's/(.)(.*)/\1\n\2 -> \L\1/;:1
s/\n([^[:upper:]]*([[:upper:]]))(.*)/\1\n\3\L\2/;t1;s/\n//'
POSIXはsed
そうではありません\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