如何用换行符替换换行符?

Mel*_*lab 5 awk sed

使用sed到包含某些字符适用于字符串常量使用使文字很简单:

sed "s/\\\\/\\\\\\\\/g"
sed "s/\\\"/\\\\\\\"/g"
Run Code Online (Sandbox Code Playgroud)

但是如何对包含换行符的文本文件做类似的事情呢?

小智 20

如果您正在处理管道命令,那么我喜欢@vossad01的答案。然而,在多行脚本中,我更喜欢普通的 Bash参数扩展,这既更高效(不需要分叉新进程sed或创建任何管道),也可能更容易阅读:

${varName//$'\n'/\\n}
Run Code Online (Sandbox Code Playgroud)

读者指南:

  • ${...}- 使用参数扩展解释内部内容
  • varName- 包含内容的变量的名称
  • //- 替换...的所有实例
  • $'\n'- 文字换行符(我们在这里将转义符转换文字)
  • /- 用。。。来代替...
  • \\n- 换行转义序列 ( "\n"):请注意,我们必须转义反斜杠本身

例子:

${varName//$'\n'/\\n}
Run Code Online (Sandbox Code Playgroud)


小智 6

用:

sed ':a;N;$!ba;s/\n/\\n/g'
Run Code Online (Sandbox Code Playgroud)

其中使用如何使用 sed 替换换行符 (\n)的答案替换一个转义的换行符作为替换来匹配这里的问题。


小智 6

我用以下方法解决了这个问题:

sed 's/$/\\n/g' | tr -d'\n'
Run Code Online (Sandbox Code Playgroud)

sed 在每行末尾放置 '\\n',然后 tr 删除换行符。


Dav*_*lan 2

sed 是基于行的,这在尝试替换换行符时可能会导致问题。

sed 的官方文档特别提到了换行符,并指出它们在传递给 sed 之前被剥离。

我建议“tr”可能更适合这里。

例如,用空格替换换行符:

tr '\n' ' ' < inputfile
Run Code Online (Sandbox Code Playgroud)

  • 那么它到底有什么帮助呢? (8认同)