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

时间:2015-04-01 07:15:27

标签: macos sed terminal

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

我试过了: sed 's/"\n"//g' < in > out 还有sed '/"\n"/d' < in > out但不是那些seds有效。

有人能告诉我我做错了什么吗?

5 个答案:

答案 0 :(得分:1)

这适用于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'

答案 1 :(得分:0)

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

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

在OSX上验证。

答案 2 :(得分:0)

这个awk-oneliner在这里工作,你可以尝试一下:

 awk -F'"\n"' -v RS='\0' -v ORS="" '{$1=$1;print}' file

小测试:用gawk测试

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

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

如果您不想在foobar blah ...之间留出空格,请将-v OFS=""添加到a​​wk

答案 3 :(得分:0)

accepted answer因为包含 Perl 命令而被标记为。

sed命令实际上并不适用于OSX,因为它使用特定于 GNU sed的功能,而OSX使用 BSD sed

等效的答案只需要一些调整 - 请注意,这将适用于 BSD GNU sed:< / p>

使用多个-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)以实际换行符终止(而在< em> GNU sed一个;就足够了),或者,将脚本划分为多个-e选项,每个部分都以需要换行符结束。
有关GNU和BSD sed之间差异的详细讨论,请参阅https://stackoverflow.com/a/24276470/45375

$':a\n$!{N;ba\n}'是用于将所有输入行读入所谓模式空间((后续)命令操作的缓冲区)的常见sed惯用语:

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

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

默认情况下,

s/"\n"//g逐行读取文件 ,因此默认情况下,它一次只能在一行上运行。

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

答案 4 :(得分:-1)

而不是sed你也可以使用tr,我已经测试了它并且对我来说它有效

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