sed:为什么命令q添加一个新行?

时间:2016-07-04 15:46:28

标签: sed newline

假设以下命令

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 
'

到目前为止,这个脚本在换行问题上工作得很好。没有添加新行。现在,如果我更换" d"使用" q"

命令
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 
'

新线问题突然出现......

欢迎其他解决方案,它们应尽可能快。

1 个答案:

答案 0 :(得分:2)

我猜这是一个错误。根据手册,如果禁用自动打印,q不应打印图案空间。因此,它不应该打印任何东西。由于您已经在使用GNU sed,因此可以使用Q代替q来避免此问题。至少,这对我有用(版本4.2.2)。