【问题标题】:Replace a word every N lines with sed between a specific line interval在特定行间隔之间用 sed 每 N 行替换一个单词
【发布时间】:2018-11-21 14:47:29
【问题描述】:

我有一个输入文件:

Line 1 a
Line 2 b
Line 3 c
Line 4 d
Line 5 e
Line 6 f
Line 7 g
Line 8 h
Line 9 i
Line 10 j
Line 11 k
Line 12 l
Line 13 m
Line 14 n
Line 15 o
Line 16 p
Line 17 q
.
.
.

我想用 sed 在特定的行间隔中插入,比如在文件的第 3 行和第 17 行之间,每 4 行替换每行的最后一个单词的单词。

在这种情况下,假设我想将Z 放在文件的第 3 行,然后是文件的第 7 行(即 3+4),然后是文件的第 11 行(即 7+4 ),然后是文件的第 15 行(即 11+4)。

有没有办法用 sed 做到这一点,但只打开一次我想要更改的文件?

预期的输出是:

Line 1 a
Line 2 b
Line 3 Z
Line 4 d
Line 5 e
Line 6 f
Line 7 Z
Line 8 h
Line 9 i
Line 10 j
Line 11 Z
Line 12 l
Line 13 m
Line 14 n
Line 15 Z
Line 16 p
Line 17 q
.
.
.

【问题讨论】:

  • 在 sed 之外生成所需的行:例如 seq 46 44 180。使用它来生成 sed 命令。

标签: sed


【解决方案1】:

如果你有 GNU sed,你可以使用<i>first</i>~<i>step</i> line addressing 形式:

sed '3,17{3~4s/\S*$/Z/}' infile

首先,我们将所有操作限制在3,17{...} 的地址范围内。

然后,在花括号内,我们运行:

3~4s/\S*$/Z/

“在第 3 行和之后的每 4 行,将行的最后一个单词(\S*$ - 非空格字符的最长序列)替换为 Z”。

【讨论】:

    【解决方案2】:

    使用 POSIX sed,您可以:

    sed '3,17{s/[^ ]*$/Z/;n;n;n;}'
    

    另一种选择是awk,它可以更灵活一点:

    awk 'NR==3,NR==17{if (c++%4==0) { $NF="Z" }}1'
    

    【讨论】:

      猜你喜欢
      • 2021-10-08
      • 2019-07-26
      • 1970-01-01
      • 2012-04-23
      • 2019-03-01
      • 1970-01-01
      • 2013-04-18
      • 2016-01-04
      • 2019-09-18
      相关资源
      最近更新 更多