我想使用sed linux命令替换文件中的某些行。 这是我要实现的目标:
cn.x1.x2 y -> cn_x1.x2 y
cn.x1.x2.x3 y -> cn_x1_x2.x3 y
cn.x1.x2.x3.x4 y -> cn_x1_x2_x3.x4 y
我想找到任何以'cn'开头的单词,并用下划线替换点,直到倒数第二个单词为止。 如何使用正则表达式实现这一目标?
预先感谢
答案 0 :(得分:1)
您可以使用sed
分两步进行操作:
echo 'cn.x1.x2.x3.x4 y' | sed -r 's|\.|_|g; s|\_([^_]*)$|.\1|'
第一步用下划线s|\.|_|g;
替换所有点
第二步将最后一个下划线以外的所有下划线替换为一个点。 s|\_([^_]*)$|.\1|
答案 1 :(得分:1)
这可能对您有用(GNU sed):
sed -E ':a;s/\.([^.]*\.)/_\1/;ta' file
用下划线替换两个句号中的第一个,并重复直到匹配失败。
答案 2 :(得分:0)
抢救Perl!
perl -pe 's/\./_/ while /cn.*\..*\./' < input > output
换句话说,当至少有两个点时,将.
替换为_
。
答案 3 :(得分:0)
如果您的数据位于“ d”文件中,则通过gnu sed:
sed -E 'h; s/(cn\S+)\.\S+\s\S+$/\1/;s/\./_/g;G;s/(.*)\ncn\S+(\.\S+\s\S+)$/\1\2/' d
通过perl:
perl -pe 's/(?!.[^.]+\s\S+$)\./_/xg' d