使用 sed 删除所有出现的“\n”

Delete all "\n" occurrences with sed

我想删除文本文件中的所有 "\n"(引号、换行、引号)。

我试过: sed 's/"\n"//g' < in > out 还有 sed '/"\n"/d' < in > out 但这些 SEDS 都不起作用。

我做错了什么?

试试这个 -- 您需要转义反斜杠以使其成为文字。

sed 's/"\n"//g' < in > out

验证于 OSX。

你也可以使用 tr 而不是 sed,我测试过它并且对我有效

tr -d '"\n"' < input.txt > output.txt

这个awk-oneliner在这里可以用,你可以试一试:

 awk -F'"\n"' -v RS='[=10=]' -v ORS="" '{=;print}' file

一个小测试:用 gawk 测试

kent$  cat f
foo"
"bar"
"bla"
new line should be kept
this too

kent$  awk -F'"\n"' -v RS='[=11=]' -v ORS="" '{=;print}' f
foo bar bla"
new line should be kept
this too

如果您不想在 foobar blah 之间添加 space ..,请将 -v OFS="" 添加到 awk

这适用于 Linux 上的 GNU sed:我没有要测试的 Mac。

sed  '
    # this reads the whole file into pattern space
    :a; N; $ bb; ba; :b
    # *now* make the replacement
    s/"\n"//g
' <<END
one
two"
"three
four"
five
"six
END
one
twothree
four"
five
"six

这个 perl 命令完成同样的事情:

perl -0777 -pe 's/"\n"//g'

被如此标记是因为它包含 Perl 命令。

sed 命令实际上在 OSX 上不起作用,因为它使用特定于 GNU sed 的功能,而 OSX 使用 BSD sed.

一个等价的答案只需要一些调整 - 请注意,这将适用于both BSD and GNU sed:

使用多个-e选项

sed -e ':a' -e '$!{N;ba' -e '}; s/"\n"//g' < in > out 

或者,在 Bash 中使用 ANSI C-quoted string

sed $':a\n$!{N;ba\n}; s/"\n"//g' < in > out 

或者,使用多行字符串文字:

sed ':a
  $!{N;ba
  }; s/"\n"//g' < in > out

BSD sed 要求标签(例如,:a)和分支命令(例如,b)以实际换行符(而在 GNU sed; 就足够了),或者,或者,脚本被分成多个 -e 选项,每个选项需要换行的部分结束。
有关 GNU 和 BSD 之间差异的详细讨论 sed,请参阅

$':a\n$!{N;ba\n}' 是一个常见的 sed 习语,用于将 所有 输入行读入所谓的模式 space (缓冲区,其中 (随后的)命令运行):

  • :a是可以分支到
  • 的标签
  • $! 匹配每一行 最后一行
    • {N;ba\n} 通过向其中添加当前行 (N) 继续构建缓冲区,然后分支回到标签 :a 以重复循环。
  • 一旦到达 last 行,不执行分支,此时的缓冲区包含 all 输入行,在该处点在整个缓冲区上执行所需的替换 (s/"\n"//g)。

至于为什么OP的方法不起作用

sed默认读取文件一行一行,所以默认一次只能一行 ].

为了能够替换 newline 字符。 - 即,要跨多行操作 - 您必须先明确阅读multiple/all行,如上所述。