我有一些文本行的文件。如果有两个"b“,我需要打印第3-7行和第11行。我做到了
sed -n '/b\{2,\}/p' file,但它打印"b“连续出现两次的行
发布于 2021-06-13 04:09:55
您可以使用
sed -n '3,7{/b[^b]*b/p};11{/b[^b]*b/p}' file
## that is equal to
sed -n '3,7{/b[^b]*b/p};11{//p}' file请注意,b[^b]*b匹配b,然后匹配b以外的任何零个或多个字符,最后匹配b。第二部分中的正则表达式匹配最新的模式,即它匹配相同的b[^b]*b正则表达式。
注如果您愿意,也可以使用b.*b正则表达式,但是括号表达式往往更快。
查看使用sed (GNU sed) 4.7测试的online demo
s='11bb1
b222b
b n b
ww
ee
bb
rrr
fff
999
10
11 b nnnn bb
www12'
sed -ne '3,7{/b[^b]*b/p};11{/b[^b]*b/p}' <<< "$s"输出:
b n b
bb
11 b nnnn bb只返回第3、6和11行。
发布于 2021-06-13 22:59:34
使用awk只是为了简单,清晰,可移植性,可维护性,等等。在每个Unix机器上的任何shell中使用任何awk:
awk '( (3<=NR && NR<=7) || (NR==11) ) && ( gsub(/b/,"&") >= 2 )' file注意,如果你需要更改一个范围,添加一个范围,添加其他行号,更改有多少个b,添加其他字符和/或字符串来匹配,添加一些完全不同的条件,等等,这些都是非常简单和简单的。
例如,如果恰好有13或27个b而不是2 or more:?,则希望打印该行。
awk '( (3<=NR && NR<=7) || (NR==11) ) && ( gsub(/b/,"&") ~ /^(13|27)$/ )' file如果行号在23和59之间但不是34,想要打印该行吗?
awk '( 23<=NR && NR<=59 && NR!=34 ) && ( gsub(/b/,"&") >= 2 )' file尝试对sed脚本进行类似的更改。我并不是说你不能强迫它发生,但它并不像使用awk那样简单、清晰、可移植等。
https://stackoverflow.com/questions/67952406
复制相似问题