【问题标题】:sed: Why does command q add a new line?sed:为什么命令 q 添加一个新行?
【发布时间】:2016-11-06 09:44:27
【问题描述】:

假设以下命令

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 cmd 真的接受可选的整数参数还是只是忽略它?如果将 q1 更改为 q 会发生什么?图解的问题,祝你好运!
  • 是的,它接受一个可选的整数。该整数用作退出代码。但是有些手册页没有指定这一点。 “q”只是“q0”的简写。

标签: sed newline


【解决方案1】:

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

【讨论】:

  • 是的,使用“Q”而不是“q”也为我解决了这个问题。非常感谢!
猜你喜欢
  • 2012-10-30
  • 1970-01-01
  • 1970-01-01
  • 2017-04-26
  • 1970-01-01
  • 1970-01-01
  • 2014-12-05
  • 2018-01-25
  • 2023-04-06
相关资源
最近更新 更多