什么sed脚本将删除" \n“字符,但仅当它在"”字符(分隔字符串)内,而不是实际位于(虚拟)行末尾的\n?例如,我想要将此文件
"lalala","lalalslalsa"
"lalalala","lkjasjdf
asdfasfd"
"lalala","dasdf"(第2行中嵌入了一个\n )
"lalala","lalalslalsa"
"lalalala","lkjasjdf \\n asdfasfd"
"lalala","dasdf"(第2行和第3行现在连接在一起,实际的换行符替换为字符串\n (或任何其他容易发现的字符串,我不挑剔))
我不想像上一个问题那样删除所有其他换行符,也不想删除所有换行符,只删除引号内的那些行。我并不执着于sed,如果awk可以工作,那也没问题。
正在操作的文件太大,无法一次性装入内存。
发布于 2014-12-10 13:40:14
对于单行上的简单替换,sed是一个优秀的工具,但对于其他任何事情,您都应该使用awk。例如:
$ cat tst.awk
{
if (/"$/) {
print prev $0
prev = ""
}
else {
prev = prev $0 " \\\\n "
}
}
$ awk -f tst.awk file
"lalala","lalalslalsa"
"lalalala","lkjasjdf \\n asdfasfd"
"lalala","dasdf"下面是我最初的答案,但在看到@NeronLeVelu在行尾测试引用的方法后,我意识到我正在以一种太复杂的方式来做这件事。您只需将下面的gsub(/"/,"&") % 2替换为/"$/,它仍然可以工作,但上面的代码是相同功能的一个更简单的实现,并且现在可以处理嵌入的转义双引号,只要它们不在行尾。
$ cat tst.awk
{ $0 = saved $0; saved="" }
gsub(/"/,"&") % 2 { saved = $0 " \\\\n "; next }
{ print }
$ awk -f tst.awk file
"lalala","lalalslalsa"
"lalalala","lkjasjdf \\n asdfasfd"
"lalala","dasdf"上面的命令一次只在内存中存储一条输出行。当输出行中的双引号数量为奇数时,它只是从输入行构建一个输出行,然后在最终包含偶数个双引号时打印输出行。
如果您可以在引用的字符串中使用双引号将其转义为\",而不是"",但您没有在发布的示例输入中显示这一点,那么它将失败,因此希望您不会遇到这种情况。如果您遇到这种情况,则需要编写/使用真正的CSV解析器。
发布于 2014-12-10 14:38:11
sed -n ':load
/"$/ !{N
b load
}
:cycle
s/^\(\([^"]*"[^"]*"\)*\)\([^"]*"[^"]*\)\n/\1\3 \\\\n /
t cycle
p' YourFile"结束)或结束到达"后面的任何字符替换为新行的转义版本(实际上,将起始字符串+\n替换为开始字符串和转义的新行)F218如果发生任何替换,请重试另一个替换(D11和result" F218
感谢@Ed Morton对转义新行的评论
https://stackoverflow.com/questions/27392567
复制相似问题