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

Linux 使用通配符搜索并在同一行上替换,linux,bash,awk,sed,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 other

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

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(同时去除波浪线)。不包含
~
字符串的行应按原样打印。i、 例如,制作:

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
...
到目前为止,我一直在尝试使用
sed
awk
,但似乎无法正确使用正则表达式

感谢您的建议。

使用正则表达式组:

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
简要说明

  • match($0,/~[^]*/)
    :搜索匹配正则表达式的模式
    /~[^]*/
  • substr($0,RSTART+1,RLENGTH)
    :返回子字符串并附加潮汐字符
  • sub(/id[0-9]/,substr)
    :替换与正则表达式匹配的第一个子字符串

这很接近,但现有ID值似乎没有被替换。。。相反,新的ID只是预先准备好的。i、 e.,
ID=id2;Name=name2;注=某些文本2~X0A1D5PFF5其他文本2变为:
ID=X0A1D5PFF5;ID=id2;Name=name2;注=某些文本2~X0A1D5PFF5其他文本2你是对的-我意识到了问题并更新了答案。请检查。它似乎仍然不起作用。。。在编辑后的表格中,没有替换。我得到了答案中所示的结果。
awk '{if(match($0,/~[^ ]*/)) sub(/id[0-9]/,substr($0,RSTART+1,RLENGTH-1))}1' file