【发布时间】: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
'
换行问题突然出现...
欢迎使用其他解决方案,它们应该尽可能快。
【问题讨论】:
-
qcmd 真的接受可选的整数参数还是只是忽略它?如果将q1更改为q会发生什么?图解的问题,祝你好运! -
是的,它接受一个可选的整数。该整数用作退出代码。但是有些手册页没有指定这一点。 “q”只是“q0”的简写。