Macos 使用sed删除所有“\n”事件
我想删除文本文件中的所有引号、新行、引号 我试过: sed's/\n//g'Macos 使用sed删除所有“\n”事件,macos,sed,terminal,Macos,Sed,Terminal,我想删除文本文件中的所有引号、新行、引号 我试过: sed's/\n//g'out 而且sed'/\n/d'out,但这些sed中没有一个起作用 我做错了什么?试试这个-你需要避开反斜杠,使其成为文字 sed 's/"\\n"//g' < in > out 已在OSX上验证。您也可以使用tr,而不是sed,我已经对它进行了测试,它对我来说很有效 tr -d '"\\n"' < input.txt > output.txt 这款awk oneliner适用于这里,您可以
我做错了什么?试试这个-你需要避开反斜杠,使其成为文字
sed 's/"\\n"//g' < in > out
已在OSX上验证。您也可以使用tr,而不是sed,我已经对它进行了测试,它对我来说很有效
tr -d '"\\n"' < input.txt > output.txt
这款awk oneliner适用于这里,您可以尝试一下:
awk -F'"\n"' -v RS='\0' -v ORS="" '{$1=$1;print}' file
小测验:用呆呆的方式进行测验
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之间留有空格,请将-v OFS=添加到awk这适用于基于Linux的GNU:我没有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
此perl命令完成了相同的任务:
perl -0777 -pe 's/"\n"//g'
由于它包含的Perl命令,所以被标记为这样
sed命令实际上不适用于OSX,因为它使用特定于GNUSED的特性,而OSX使用BSDSED
一个等价的答案只需要几处调整-请注意,这将适用于BSD和GNU sed:
使用多个-e选项:
或者,使用in-Bash:
或者,使用多行字符串文字:
BSD sed要求标签,如:a和分支命令,如b,以实际换行符终止,而在GNU sed a中;这就足够了,或者,也可以将脚本分解为多个-e选项,每个部分在需要换行符的地方结束。
有关GNU和BSD sed之间差异的详细讨论,请参阅
$':a\n$!{N;ba\N}是一种常见的sed习惯用法,用于将所有输入行读入所谓的模式空间缓冲区,后续命令将在该缓冲区上运行:
:a是可以分支到的标签
$! 匹配除最后一行之外的每一行
{N;ba\N}通过将当前行N添加到缓冲区中,然后分支回label:a以重复该循环,从而不断构建缓冲区。
一旦到达最后一行,就不会执行分支,并且该点的缓冲区包含所有输入行,此时将对整个缓冲区执行所需的替换s/\n//g。
至于OP的方法不起作用的原因:
默认情况下,sed逐行读取文件,因此默认情况下,它一次只能在一行上运行
为了能够替换换行符。-i、 例如,要跨多行操作-必须先显式读取多行/所有行,如上所述。删除文件中的所有引号。只有忘记转义反斜杠时,才会删除所有新行。如果转义反斜杠,tr将另外删除所有\和n个字符。OP的问题无法用tr解决,tr只对单个字符集进行操作。可能的重复您可能需要unix2dos,请参见您是指在一行的末尾、文字换行和下一行的开头,还是指这四个字符?为了澄清,由于应替换内容的表示法令人困惑:根据接受的答案,目的是删除所有由以下内容组成的3个字符的子字符串:文字双引号,后跟实际换行符,后跟文字双引号。这也将foo\nbar更改为foobar@user3840048不,不会的,至少在这里不会;您是否使用gawk进行了测试?sed在默认情况下是面向行的,因此,除非您使用N或H,否则对于不熟悉Perl的人来说,模式/保留空间中不会有换行符:Perl-0777是一种一次读取整个输入文件所有行的习惯用法+
perl -0777 -pe 's/"\n"//g'
sed -e ':a' -e '$!{N;ba' -e '}; s/"\n"//g' < in > out
sed $':a\n$!{N;ba\n}; s/"\\n"//g' < in > out
sed ':a
$!{N;ba
}; s/"\n"//g' < in > out