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匹配^ID=[:alnum:]+
-匹配所有符合(.*)~
~
-匹配([[: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=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