我有以下项目清单:
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 -> aceg
sed
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