我正在尝试使用以下常规格式编辑大型文本文件:
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
,但我似乎无法正确使用正则表达式...
感谢您的任何建议。
答案 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
:替换与正则表达式匹配的第一个子字符串