行号后的linux匹配模式直到结束并替换一次

时间:2019-05-30 10:33:48

标签: linux unix awk sed

要求是这样的:

输入文件:

.......
.......
foo ......
.......
.......
foo ......
.......
.......
foo ......
.......
.......

输出文件:

.......
.......
foo bar
.......
.......
foo nobar
.......
.......
foo barno
.......
.......

我已经考虑了逻辑并找到了实现上述内容的部分。逻辑就是这样。

  1. 最初lineno=0
  2. lineno到文件结尾的匹配模式。找到样式后,获取行号lineno=<matched line number> + 1,仅用第一个值替换一次。
  3. 使用第二个值重复第二步。
  4. 用第三个值重复第二步。

我只发现了如何获取匹配模式的行号,如何只替换一次。但是对于第一部分“从文件的特定行号开始匹配”,我什么也没得到。

在Linux中可以满足上述要求吗?

提及逻辑是可取的,因为它可以循环处理。也欢迎其他想法/改进。

1 个答案:

答案 0 :(得分:0)

这是一个示例awk脚本,可以一次完成该任务。

输入文件input.txt

line 1
foo line 2
foo line 3
line 4
foo line 5
foo line 6
line 7
line 8
foo line 9
foo line 10
line 11
foo line 12

awk脚本script.awk

/^foo / {               # for each input line starting with foo
    fooCount++;         # increment foo coutner
    if (fooCount%3 == 1) $1 = $1" bar";   # First match. Add bar to 1st field
    if (fooCount%3 == 2) $1 = $1" nobar"; # Second match. Add nobar to 1stfield
    if (fooCount%3 == 0) $1 = $1" barno"; # Third match. Add barno to 1st field
}
1                       # print current line

运行命令:

awk -f script.awk input.txt

输出:

line 1
foo bar line 2
foo nobar line 3
line 4
foo barno line 5
foo bar line 6
line 7
line 8
foo nobar line 9
foo barno line 10
line 11
foo bar line 12

请发表评论