我遇到过用于从文本文件打印特定行的解决方案:
sed '123!d;q' file
在这种情况下,为什么sed在输入的第一行之后不退出?
我遇到过用于从文本文件打印特定行的解决方案:
sed '123!d;q' file
在这种情况下,为什么sed在输入的第一行之后不退出?
Answers:
用英语来说,该sed
程序的意思是:对于每一行,
123!
]如果当前行号不是123,则[ d
]删除当前行并开始下一个循环(即,移至下一行);d
在未执行命令的情况下,我们才能到达这一点),[ q
]退出而不处理任何其他行(但请在即将死去的阵痛中打印出当前行)。或者,如果您愿意,可以使用shell语法:
line_number=0
while IFS= read -r pattern_space; do
line_number=$(($line_number+1))
if [ $line_number -ne 123 ]; then # 123!
continue # d
fi
echo "$pattern_space"; break # q
echo "$pattern_space" # implicit final print (never reached)
done
{d;q;}
,不应该q
适用于每行(因此仅适用于第一行)吗?
q
适用于执行它的每一行。但是当行号不是123时,将d
执行该命令,其含义是立即跳到下一个输入行。
sed -n 123p
(打印相同的输出)相同,只是它在第123行之后停止,而不是处理可能成千上万的行,无论如何它永远不会做任何事情。
!
与之相关d
,但与之无关123
。