使用通配符搜索并替换在同一行

时间:2017-10-06 00:00:23

标签: linux bash awk sed

我正在尝试使用以下常规格式编辑大型文本文件:

ID=id1;Name=name1
ID=id2;Name=name2;Note= sometext2 ~X0A1D5PFF5 othertext2;
ID=id3;Name=name3;Note= sometext3 ~Q87362 othertext3;
ID=id4
ID=id5;Note= sometext5 ~G1NYZ3 othertext5;
ID=id6;Name=name6;Note= sometext6 ~M1C0K5 othertext6;
ID=id7
...

我的目标是生成一个具有相同行顺序的文件,但是对于包含带有~前缀的字符串的行,用该字符串替换同一行上的ID(同时剥去波浪号)。不包含~字符串的行应该按原样打印。即产生这个:

ID=id1;Name=name1
ID=X0A1D5PFF5;Name=name2;Note= sometext2 ~X0A1D5PFF5 othertext2;
ID=Q87362;Name=name3;Note= sometext3 ~Q87362 othertext3;
ID=id4
ID=G1NYZ3;Note= sometext5 ~G1NYZ3 othertext5;
ID=M1C0K5;Name=name6;Note= sometext6 ~M1C0K5 othertext6;
ID=id7
...

到目前为止,我一直在尝试使用sedawk,但我似乎无法正确使用正则表达式...

感谢您的任何建议。

2 个答案:

答案 0 :(得分:1)

使用正则表达式组:

sed -E 's/^ID=[[:alnum:]]+;(.*)~([[:alnum:]]+) /ID=\2;\1~\2 /' file > file.modified
  • -E - 使用扩展正则表达式
  • ^ID=[[:alnum:]]+与现有ID匹配
  • (.*)~ - 匹配~
  • 以外的所有内容
  • ([[:alnum:]]+) - 匹配~
  • 后面的字母数字标记
  • ID=\2;\1~\2 - 引用正则表达式组的替换字符串

输出:

ID=id1;Name=name1
ID=X0A1D5PFF5;Name=name2;Note= sometext2 ~X0A1D5PFF5 othertext2;
ID=Q87362;Name=name3;Note= sometext3 ~Q87362 othertext3;
ID=id4
ID=G1NYZ3;Note= sometext5 ~G1NYZ3 othertext5;
ID=M1C0K5;Name=name6;Note= sometext6 ~M1C0K5 othertext6;
ID=id7

答案 1 :(得分:0)

match($0,/~[^ ]*/)

简要说明,

  • /~[^ ]*/:搜索匹配正则表达式substr($0,RSTART+1,RLENGTH)
  • 的模式
  • sub(/id[0-9]/, substr):返回子字符串追加潮流字符
  • https://github.com/J-A-M-E-5/heroku14-buildpack-python-opencv-dlib.git :替换与正则表达式匹配的第一个子字符串