Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 使用sed删除所有“\n”事件_Macos_Sed_Terminal - Fatal编程技术网

Macos 使用sed删除所有“\n”事件

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'out 而且sed'/\n/d'out,但这些sed中没有一个起作用


我做错了什么?

试试这个-你需要避开反斜杠,使其成为文字

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