我想删除文本文件中的所有"\n"
(引号,新行,引号)。
我试过了:
sed 's/"\n"//g' < in > out
还有sed '/"\n"/d' < in > out
但不是那些seds有效。
有人能告诉我我做错了什么吗?
答案 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
如果您不想在foo
和bar
blah
...之间留出空格,请将-v OFS=""
添加到awk
答案 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
以重复循环。至于为什么OP的方法不起作用:
默认情况下, s/"\n"//g
逐行读取文件 ,因此默认情况下,它一次只能在一行上运行。
为了能够替换换行符字符。 - 即,要跨多行操作 - 您必须首先明确读取多行/所有行,如上所述。
答案 4 :(得分:-1)
而不是sed你也可以使用tr,我已经测试了它并且对我来说它有效
tr -d '"\\n"' < input.txt > output.txt