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

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,但似乎无法正确使用regex。。。
谢谢你的建议。

最佳答案

使用正则表达式组:

sed -E 's/^ID=[[:alnum:]]+;(.*)~([[:alnum:]]+) /ID=\2;\1~\2 /' file > file.modified

-E-使用扩展regex
^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

10-07 19:43
查看更多