正则表达式(sed)可能需要每行捕获多个表达式

时间:2012-10-25 20:00:24

标签: regex sed awk

我正在尝试编写一个正则表达式来捕获文件中的名称,其中某些行可能有2个或更多需要捕获的名称。

例如,我想带一个文件:

Field_1 \t Field_2 \t Field_3 \t JGN;Name=hsa-123;J4N9;Name=cfa-241-b
Field_1 \t Field_2 \t Field_3 \t JPN;Name=hsa-1323;JJ39;Name=cfa-255-b;Name=hsa-188

输出文件返回:

Field_1 \t Field_2 \t Field_3 \t hsa-123; cfa-241-b
Field_1 \t Field_2 \t Field_3 \t hsa-1323;cfa-255-b;hsa-188

我正在使用正则表达式如下:

sed 's/\(.*\)\t\(.*\)\t\(.*\)\t.*\;Name=\(.*\);.*/\1\t\2\t\3\t\4\;\4/g'

但这只返回名字。任何建议将不胜感激

2 个答案:

答案 0 :(得分:4)

确实

sed 's/\([[:space:]]\|;\)[[:alnum:]]*;/\1/g; s/Name=//g'

为你工作?

答案 1 :(得分:0)

$ sed -E 's/ [^ ;]+;//; s/;[^=]+;/;/g; s/Name=//g' file
Field_1 \t Field_2 \t Field_3 \thsa-123;cfa-241-b
Field_1 \t Field_2 \t Field_3 \thsa-1323;cfa-255-b;hsa-188

如果您的sed不支持ERE(-E),则将[^;] +改为[^;] [^;] *和[^ =] +改为[^ =] [^ =] *或使用awk与[g] sub()。