sed:为什么命令 q 添加新行?
sed: Why does command q add a new line?
假设如下命令
echo -en "abc1\ndef2\nghi1" | sed -n 'p; d;'
在这种情况下,输出与完全没有 sed 时的输出相同。所以最后一行仍然没有换行符。下一个命令
echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; d;}'
sed 打印除最后一行以外的所有内容,不加修改。最后一行缩短了一个字符。最后一行仍然没有换行符。下一个命令
echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; q1;}'
("d" 在最后一个命令块中被 "q1" 替换。与之前相同的输出,但这次在最后一行有一个额外的换行符。
- 为什么?
- 如何修复?
(对于那些对此命令的意图感兴趣的人:给定某个 STDIN,我想扫描最后一个字符,将 STDIN 传递到没有最后一个字符的 STDOUT,并根据该字符设置退出代码.应该没有其他修改了.sed好像很完美,如果没有这个换行问题
sed -n '
$! {p; d;}; #print any non last line, do next cycle
/0$/ {s/0$//; p; d}; #last line ending with 0? Remove 0, print, next cycle
/1$/ {s/1$//; p; d}; #last line ending with 1? Remove 1, print, next cycle
{p} #fall back, print last line
'
到目前为止,这个脚本在换行问题上工作得很好。没有添加新行。现在,如果我用 "q"
替换 "d" 命令
sed -n '
$! {p; d;}; #print any non last line, do next cycle
/0$/ {s/0$//; p; q0}; #last line ending with 0? Remove 0, print, exit 0
/1$/ {s/1$//; p; q1}; #last line ending with 1? Remove 1, print, exit 1
{p} #fall back, print last line
'
突然出现换行问题...
欢迎使用其他解决方案,它们应该尽可能快。
我想这是一个错误。根据手册,如果禁用自动打印,q
不应打印模式 space。因此,它不应该打印任何东西。因为您已经在使用 GNU sed
,您可以使用 Q
而不是 q
来避免这个问题。至少,这对我有用(版本 4.2.2)。
假设如下命令
echo -en "abc1\ndef2\nghi1" | sed -n 'p; d;'
在这种情况下,输出与完全没有 sed 时的输出相同。所以最后一行仍然没有换行符。下一个命令
echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; d;}'
sed 打印除最后一行以外的所有内容,不加修改。最后一行缩短了一个字符。最后一行仍然没有换行符。下一个命令
echo -en "abc1\ndef2\nghi1" | sed -n '$! {p; d;}; /1$/ {s/1$//; p; q1;}'
("d" 在最后一个命令块中被 "q1" 替换。与之前相同的输出,但这次在最后一行有一个额外的换行符。
- 为什么?
- 如何修复?
(对于那些对此命令的意图感兴趣的人:给定某个 STDIN,我想扫描最后一个字符,将 STDIN 传递到没有最后一个字符的 STDOUT,并根据该字符设置退出代码.应该没有其他修改了.sed好像很完美,如果没有这个换行问题
sed -n '
$! {p; d;}; #print any non last line, do next cycle
/0$/ {s/0$//; p; d}; #last line ending with 0? Remove 0, print, next cycle
/1$/ {s/1$//; p; d}; #last line ending with 1? Remove 1, print, next cycle
{p} #fall back, print last line
'
到目前为止,这个脚本在换行问题上工作得很好。没有添加新行。现在,如果我用 "q"
替换 "d" 命令sed -n '
$! {p; d;}; #print any non last line, do next cycle
/0$/ {s/0$//; p; q0}; #last line ending with 0? Remove 0, print, exit 0
/1$/ {s/1$//; p; q1}; #last line ending with 1? Remove 1, print, exit 1
{p} #fall back, print last line
'
突然出现换行问题...
欢迎使用其他解决方案,它们应该尽可能快。
我想这是一个错误。根据手册,如果禁用自动打印,q
不应打印模式 space。因此,它不应该打印任何东西。因为您已经在使用 GNU sed
,您可以使用 Q
而不是 q
来避免这个问题。至少,这对我有用(版本 4.2.2)。