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

使用sed替换搜索模式之前的部分行,sed,Sed,在这方面确实需要一些帮助,尝试使用sed(希望这是最好的解决方案)替换每个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,LON

在这方面确实需要一些帮助,尝试使用sed(希望这是最好的解决方案)替换每个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,
结果文件

;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;

我会使用
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
awk-f fix.awk
解释:

/^;/{…}
-在以
开头的所有行上执行
{…}
代码

打印gensub(/,$/,“;”,“,”,last)
-将最后一个
替换为
last
中的code>(保存前一行)

打印-打印当前行

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

尝试这一行:

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

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

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

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;
这可能适用于您(GNU-sed):

或者从另一个角度来看:

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

如果行不是以
开头(或以
结尾)将其添加到保留空间(HS),如果不是最后一行,则将其删除。否则它必须以“;”开头(或不以
)结尾,如果是第一行,则将其添加到HS并删除,否则交换到HS并替换
的最后一行
。注意:当前行现在在HS中。对于作为最后一行的边缘情况,它不会被删除并通过替换命令进行操作。

这不会处理文件中的最后一行。
sed '/,$/{H;$!d};1{h;d};x;s//;/' file