使用sed替换搜索模式之前的部分行
在这方面确实需要一些帮助,尝试使用sed(希望这是最好的解决方案)替换每个lat-long块的最后一个逗号。下面的例子 原始文件使用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
;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