通过另一个命令在两个正则表达式之间管道

时间:2013-05-19 09:52:10

标签: awk unix

这与我最近提出的another question有关。

我有一个包含多个部分的文本文件。部分文件看起来像这样。

3. line 3
4. line 4

## Screenshots ##

1. line 1
2. line 2
3. line 3
4. line 4

## Changelog ##

3. line 3
4. line 4

我想转换此文件,以便文件的所有行都存在于转换后的文件中,screenshot部分中的行通过另一个命令传递,然后再添加到此文件中。

因此转换的文件可能看起来像

3. line 3
4. line 4

## Screenshots ##

1. modified 1
2. modified 2
3. modified 3
4. modified 4

## Changelog ##

3. line 3
4. line 4

我有以下命令,只打印screenshot部分中的行。 (来自here

awk '/^## Screenshot/{p=1;print;next} p&&/^##/{p=0};p' readme.md 

我通过管道输入上面命令的输出来测试我的命令,它可以工作。

但是现在我想要打印文件的其他行也不受影响。怎么做?

1 个答案:

答案 0 :(得分:1)

如果您可以在awk中轻松修改文本(例如,将“line”转换为“modified”),请直接执行:

awk '/^## Screenshot/{p=1} p{gsub( "line", "modified")} p&&/^##/{p=0}; 1' readme.md

如果由于某种原因在awk中进行替换是不可行的,你可以简单地让awk分解输出然后加入:

awk '/^## Screenshot/{f="file2"} 
    f=="file2" && /^##/{f="file3"} 
    {print > f}' f=file1 readme.md
... # Now perform the desired filter on file2
cat file1 file2 file3 > final_output  # Concatenate results