sed命令如何工作?


12

我遇到过用于从文本文件打印特定行的解决方案:

sed '123!d;q' file

在这种情况下,为什么sed在输入的第一行之后不退出?

Answers:


20

用英语来说,该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,但与之无关123
rozcietrzewiacz

@Gilles:缺少括号{d;q;},不应该q适用于每行(因此仅适用于第一行)吗?
enzotib

1
@enzotib q适用于执行它的每一行。但是当行号不是123时,将d执行该命令,其含义是立即跳到下一个输入行。
吉尔(Gilles)“所以,别再邪恶了”,

明确的解释
Rahul Patil 2014年

本质上,它的作用与sed -n 123p(打印相同的输出)相同,只是它在第123行之后停止,而不是处理可能成千上万的行,无论如何它永远不会做任何事情。
通配符
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.