对给定的行号执行 sed 操作

Wei*_*hou 10 sed

我想知道是否有一种简单的方法可以使用预先分配的行号对某些行进行操作。

假设我想输出文件的第 1、7、14 和 16 行,我可以简单地做

sed -n '1p;7p;14p;16p' input_file
Run Code Online (Sandbox Code Playgroud)

但是当操作不仅仅是打印时这会变得更加复杂,而且我不想写相同的长命令 4 次(是的,我知道我可以通过替换相同的 bash 变量 4 次来构造这个长 sed 命令,但是这还不够理想......),即

sed -n '1{long_command};7{long_command};14{long_command};16{long_command}' input_file
Run Code Online (Sandbox Code Playgroud)

有没有办法对我的文件的这些特定行进行操作?我期待这样的事情,

sed -n '1,7,14,16p'
Run Code Online (Sandbox Code Playgroud)

这肯定不会以当前的形式工作。

任何帮助将不胜感激。“不,这不可能。” 有解释也是我会接受的答案。

Sté*_*las 12

您可以使用分支:

sed '
  1b1
  7b1
  14b1
  16b1

  # for the rest to be left alone, branch off (or delete them with "d"):
  b

  :1
  long_command'
Run Code Online (Sandbox Code Playgroud)

(请注意,您还可以添加一些20,25b1行范围,或/re/b1包含与 匹配的行re)。

或者你可以使用awk

awk 'NR == 1 || NR == 7 || ... {stuff}'
Run Code Online (Sandbox Code Playgroud)

或者使用哈希:

awk -v l=1,7,14,16 '
  BEGIN{split(l, a, ","); for (i in a) lines[a[i]]}

  NR in lines {stuff}'
Run Code Online (Sandbox Code Playgroud)

(或者BEGIN{lines[1]lines[7]lines[14]lines[16]}如果没有太多)