使用 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
如果您不想在 foo
和 bar
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行,如上所述。
我想删除文本文件中的所有 "\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
如果您不想在 foo
和 bar
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'
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行,如上所述。