首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用sed删除嵌入的换行符

问使用sed删除嵌入的换行符
EN

Stack Overflow用户
提问于 2014-12-10 03:58:05
回答 2查看 950关注 0票数 2

什么sed脚本将删除" \n“字符,但仅当它在"”字符(分隔字符串)内,而不是实际位于(虚拟)行末尾的\n?例如,我想要将此文件

代码语言:javascript
复制
"lalala","lalalslalsa"
"lalalala","lkjasjdf
asdfasfd"
"lalala","dasdf"

(第2行中嵌入了一个\n )

代码语言:javascript
复制
"lalala","lalalslalsa"
"lalalala","lkjasjdf \\n asdfasfd"
"lalala","dasdf"

(第2行和第3行现在连接在一起,实际的换行符替换为字符串\n (或任何其他容易发现的字符串,我不挑剔))

我不想像上一个问题那样删除所有其他换行符,也不想删除所有换行符,只删除引号内的那些行。我并不执着于sed,如果awk可以工作,那也没问题。

正在操作的文件太大,无法一次性装入内存。

EN

回答 2

Stack Overflow用户

发布于 2014-12-10 13:40:14

对于单行上的简单替换,sed是一个优秀的工具,但对于其他任何事情,您都应该使用awk。例如:

代码语言:javascript
复制
$ 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替换为/"$/,它仍然可以工作,但上面的代码是相同功能的一个更简单的实现,并且现在可以处理嵌入的转义双引号,只要它们不在行尾。

代码语言:javascript
复制
$ 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解析器。

票数 2
EN

Stack Overflow用户

发布于 2014-12-10 14:38:11

代码语言:javascript
复制
sed -n ':load
/"$/ !{N
      b load
      }
:cycle
s/^\(\([^"]*"[^"]*"\)*\)\([^"]*"[^"]*\)\n/\1\3 \\\\n /
t cycle
p' YourFile

  • 将行加载到工作缓冲区中,直到找到结束行(以"结束)或结束到达
  • 将任何\n之后的任何\n打开/关闭"后面的任何字符替换为新行的转义版本(实际上,将起始字符串+\n替换为开始字符串和转义的新行)F218如果发生任何替换,请重试另一个替换(D11和result
  • continue "

F218

感谢@Ed Morton对转义新行的评论

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27392567

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档