使用sed替换搜索模式之前的部分行

时间:2013-05-23 20:06:56

标签: sed

真的需要一些帮助,尝试使用sed(希望这是最好的解决方案)来替换每个lat longs块的最后一个逗号。以下示例。

原始文件

;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,

产生的文件

;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG;
;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG;
;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG;

5 个答案:

答案 0 :(得分:2)

我会使用awk

/^;/ {if(last) print gensub(/,$/,";","",last);print; next;}
{if(last) print last; last=$0}
END {print gensub(/,$/,";","",last)}

将其保存到fix.awk等文件并运行

awk -f fix.awk < data

<强>说明:

/^;/ {...} - 在{...}

开头的所有行上执行;代码

print gensub(/,$/,";","",last) - 将变量,中的;替换为last(保留上一行)

print; - 打印当前行

next - 转到下一行(并且不要在此行执行{if(last) print last; last=$0}

答案 1 :(得分:2)

sed解决方案:

sed -n 'N;/\n;/s/,\n/;\n/;P;$s/.*\n\(.*\),$/\1;/p;D' file

丑陋是因为必须单独处理最后一行。没有它,命令就是

sed -n 'N;/\n;/s/,\n/;\n/;P;D' file

答案 2 :(得分:2)

一种解决方案,只保存region行之间的每个块并替换最后一个逗号:

sed -n '
    ## If first line, print and process next one.
    1 { p; b };
    ## While not match "region" line, save data to hold space and
    ## process next one. If last line avoid read next one because
    ## it would end the script.
    /^;REGION/! { H; $! b }; 
    ## Get data of hold space.
    x; 
    ## Remove leading newline created with "H" instruction.
    s/^\n//; 
    ## Substitute last comma.
    s/,$/;/; 
    ## Print all.
    p; 
    ## Remove to save next block of data.
    s/^.*$//
' infile

它产生:

;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG;
;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG;
;REGION 
SOLID,
LAT,LONG,
LAT,LONG,
LAT,LONG,
LAT,LONG;

答案 3 :(得分:1)

尝试这个awk行:

awk  '!/LONG,$/{if(p~/LONG,/)sub(/,$/,";",p)}
{if(p)print p;p=$0}
END{if(p~/LONG,/)sub(/,$/,";",p);print p}' file

答案 4 :(得分:1)

这可能适合你(GNU sed):

sed '/^;/!{H;$!d};1{h;d};x;s/,$/;/' file

或以另一种方式看待它:

sed '/,$/{H;$!d};1{h;d};x;s//;/' file

如果该行不以;开头(或以,结尾),请将其添加到保留空间(HS),如果不是最后一行,则将其删除。否则必须开始';' (或者不以,结尾)如果是第一行,则将其添加到HS并删除,否则交换到HS并替换,的{​​{1}}。注:目前的线路现在在HS中。对于它是最后一行的边缘情况,它不会被删除并且也会被删除命令。