我正在尝试使用以下常规格式编辑大文本文件:
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
...
到目前为止,我一直在尝试使用
sed
和awk
,但似乎无法正确使用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