在unix中的带引号的字符串中删除换行符

时间:2014-08-21 14:08:46

标签: unix newline

我有一个像这样的文本文件:

abc 123 xyz
"abc
123" xyz

如果新行出现在带引号的字符串中,我想用空格替换新行('')。所以我想要输出:

abc 123 xyz
abc 123 xyz

有没有办法在Unix中为此编写程序?

1 个答案:

答案 0 :(得分:0)

您可以打印一个新行或只是一个空格,具体取决于到目前为止"到目前为止的数量。这样,如果我们关闭报价,就会打印新行。

$ awk '{n=split($0,a,"\""); val+=(n-1); gsub("\"",""); printf "%s%s", $0, (val%2?" ":"\n")}' file
abc 123 xyz
abc 123 xyz

解释

  • n=split($0,a,"\"")计算当前行中出现的"个。由于split()会根据"作为分隔符返回多少件,至少我们会得到1的值。
  • val+=(n-1)跟踪余额。 -1只计算引号数,因为拆分返回的数量超过了所需数量。
  • gsub("\"","")删除字符串中的双引号。
  • printf "%s%s", $0, (val%2?" ":"\n")将该行与空格或新行一起打印出来。如果val是2的倍数,则为新行;否则,空间。

测试

另一个例子:

$ cat a
abc 123 xyz
"abc
hee
123" xyz
and "this
is not everything"
$ awk '{n=split($0,a,"\""); val+=(n-1); gsub("\"",""); printf "%s%s", $0, (val%2?" ":"\n")}' a
abc 123 xyz
abc hee 123 xyz
and this is not everything