【发布时间】:2014-05-12 18:54:08
【问题描述】:
sed '/Storage/,/Design/p' sample.txt
以上有助于打印Storage 和Design 之间的行。
我的问题是如何获得上述 sed 命令的第二次出现?
我的文件有很多存储 - 设计模式匹配,但我想采用第二个出现的段落。
【问题讨论】:
sed '/Storage/,/Design/p' sample.txt
以上有助于打印Storage 和Design 之间的行。
我的问题是如何获得上述 sed 命令的第二次出现?
我的文件有很多存储 - 设计模式匹配,但我想采用第二个出现的段落。
【问题讨论】:
这个awk 打印第二部分:
cat file
start
1 data
end
not this
start
2 more data
end
not here
awk '/start/ {f=1;a++} f && a==2; /end/ {f=0}' file
start
2 more data
end
如果文件中的start 比end 多,这算start/end 组
cat file
start
start
1 data
end
not this
start
2 more data
end
not here
awk '/start/ {f=1} f && a==1; /end/ {if (f) a++;f=0}' file
start
2 more data
end
【讨论】:
Perl 解决方案:
perl -ne '$count++ if /start/; print if /start/ .. /end/ and 2 == $count'
【讨论】:
sed -n '/Storage/,/Design/ H
/Design/ {
g
s/\(.*Storage\)\{2\}/Storage/
t print
b
: print
p
q
}' YourFile
将所有存储部分保留在缓冲区中,当缓冲区添加 2 个存储部分时,请先移除,打印部分并退出。我使用\{2\} 轻松更改选定的出现(如果我记得很好,sed 限制为 255,但很容易解决)
【讨论】:
这可能对你有用(GNU sed):
sed -n '/Storage/,/Design/{x;/./{x;p;x};x;/Design/h}' file
正如@jotne 指出的在第二次出现后停止:
sed -n '/Storage/,/Design/{x;/./{x;p;/Design/q;x};x;/Design/h}' file
【讨论】: