others - sed :如何用空行分隔记录

我想使用\'sed \'连接三行,用空行分隔,字段用空格分隔。

这里有一段来自文件的数据:


KDFW


N 32°53.83\'


W 097°02.26\'



TOC


N 32°48.49\'


W 097°01.39\'



DART


N 32°17.15\'


W 096°48.66\'



我需要组合这样的行:


KDFW N 32°53.83\' W 097°02.26\'


TOC N 32°48.49\' W 097°01.39\'


DART N 32°17.15\' W 096°48.66\'




sed \'N;s/n/ /\' navlog.txt | sed \'N;s/n/ /\'



时间:

如果你正在寻找一个不需要管道的sed命令,这个能很好工作!


sed \'N;N;s/n/ /g;N;s/n/ /;s/ $//\' navlog.txt


KDFW N 32°53.83\' W 097°02.26\' 


TOC N 32°48.49\' W 097°01.39\' 


DART N 32°17.15\' W 096°48.66\'



或者亚历克斯·哈维建议:


sed \'$!N;$!N;$!N;s/n/ /g;s/ $//\' navlog.txt 


KDFW N 32°53.83\' W 097°02.26\' 


TOC N 32°48.49\' W 097°01.39\' 


DART N 32°17.15\' W 096°48.66\'



如果文件的结尾是一个空行:


$ cat navlog.txt 


KDFW


N 32°53.83\'


W 097°02.26\'



TOC


N 32°48.49\'


W 097°01.39\'



DART


N 32°17.15\'


W 096°48.66\'



^^^^^^^^^^^



你可以将命令简化为:


sed \'N;N;N;s/n/ /g;s/ $//\' navlog.txt


KDFW N 32°53.83\' W 097°02.26\' 


TOC N 32°48.49\' W 097°01.39\' 


DART N 32°17.15\' W 096°48.66\'



如果要删除空行,最好在末尾添加空格,需要通过(s/$// )移除,直接使用:


sed \'/S/!d;N;N;s/n/ /g\'navlog.txt


KDFW N 32°53.83\' W 097°02.26\' 


TOC N 32°48.49\' W 097°01.39\' 


DART N 32°17.15\' W 096°48.66\'



我认为awk是更好的方式:


awk -v RS="nn" \'gsub(/n/,"")\' file



这应该给你想要的结果。

你不需要为此使用sed ,使用paste就可 :


▶ paste - - - - < input


KDFW N 32°53.83\' W 097°02.26\'


TOC N 32°48.49\' W 097°01.39\'


DART N 32°17.15\' W 096°48.66\'



另请注意,这个输出是默认的tab分隔,它的内容如下:


▶ paste -d\' \' - - - - < input


KDFW N 32°53.83\' W 097°02.26\' 


TOC N 32°48.49\' W 097°01.39\' 


DART N 32°17.15\' W 096°48.66\' 



Perl :


perl -pe \'s/n/ / if /./\' navlog.txt



或者:


perl -pe \'s/n/ / if $.%4\' navlog.txt



...