Unix - 需要从跨多行的记录中删除换行符

Unix - 需要从跨多行的记录中删除换行符

我有一个如下文件

"IN001~24Apr16~Hi,
what a way?
oh no!~
not here~"
"IN003~29Apr16~
what a way?
~oh no!
say again.
not again~"

我想要以下格式的输出

"IN001~24Apr16~Hi,what a way?oh no!~not here~"
"IN003~29Apr16~what a way?~oh no!say again.not again~"

任何使用 awk 或 sed 的解决方案都非常受欢迎。

答案1

awk '{ printf "%s",$0 }; /"$/ { print ""; };' inputfile

仅当输入行以双引号结尾时,输出中才会有换行符。因此,此awk代码输出所有输入行,不带换行符。之后,它检查输入行是否以 a 结尾",如果是,则输出换行符。

答案2

$ sed -n -e '/^"/{h;n;}' -e H -e '/"$/{g;s/\n//g;p;}' file
"IN001~24Apr16~Hi,what a way?oh no!~not here~"
"IN003~29Apr16~what a way?~oh no!say again.not again~"

sed命令将...

  • /^"/{h;n;}:将所有以 开头的行复制"到保留空间 ( h),覆盖其中的所有内容,然后立即移至下一行输入 ( n)。

  • H:其他行附加到保留空间。

  • /"$/{g;s/\n//g;p;}:如果一行以 结尾",则将获取保留空间 ( g) 并从中删除换行符(在将行追加到保留空间时添加这些换行符),并打印结果字符串。

命令行可以压缩一下:

$ sed -n '/^"/{h;n;};H;/"$/{g;s/\n//g;p;}' file

相关内容