首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >打印出现两次或更多次特定字符的特定行

打印出现两次或更多次特定字符的特定行
EN

Stack Overflow用户
提问于 2021-06-13 03:36:40
回答 2查看 63关注 0票数 3

我有一些文本行的文件。如果有两个"b“,我需要打印第3-7行和第11行。我做到了

sed -n '/b\{2,\}/p' file,但它打印"b“连续出现两次的行

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-06-13 04:09:55

您可以使用

代码语言:javascript
复制
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

代码语言:javascript
复制
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"

输出:

代码语言:javascript
复制
b  n    b
bb
11 b nnnn bb

只返回第3、6和11行。

票数 2
EN

Stack Overflow用户

发布于 2021-06-13 22:59:34

使用awk只是为了简单,清晰,可移植性,可维护性,等等。在每个Unix机器上的任何shell中使用任何awk:

代码语言:javascript
复制
awk '( (3<=NR && NR<=7) || (NR==11) ) && ( gsub(/b/,"&") >= 2 )' file

注意,如果你需要更改一个范围,添加一个范围,添加其他行号,更改有多少个b,添加其他字符和/或字符串来匹配,添加一些完全不同的条件,等等,这些都是非常简单和简单的。

例如,如果恰好有13或27个b而不是2 or more:?,则希望打印该行。

代码语言:javascript
复制
awk '( (3<=NR && NR<=7) || (NR==11) ) && ( gsub(/b/,"&") ~ /^(13|27)$/ )' file

如果行号在23和59之间但不是34,想要打印该行吗?

代码语言:javascript
复制
awk '( 23<=NR && NR<=59 && NR!=34 ) && ( gsub(/b/,"&") >= 2 )' file

尝试对sed脚本进行类似的更改。我并不是说你不能强迫它发生,但它并不像使用awk那样简单、清晰、可移植等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67952406

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档