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)。