假设以下命令
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
'
新线问题突然出现......
欢迎其他解决方案,它们应尽可能快。
答案 0 :(得分:2)
我猜这是一个错误。根据手册,如果禁用自动打印,q
不应打印图案空间。因此,它不应该打印任何东西。由于您已经在使用GNU sed
,因此可以使用Q
代替q
来避免此问题。至少,这对我有用(版本4.2.2)。