真的需要一些帮助,尝试使用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;
答案 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中。对于它是最后一行的边缘情况,它不会被删除并且也会被删除命令。