使用sed命令和正则表达式替换行

时间:2019-04-17 13:49:48

标签: linux sed

我想使用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'开头的单词,并用下划线替换点,直到倒数第二个单词为止。 如何使用正则表达式实现这一目标?

预先感谢

4 个答案:

答案 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