sed - 打印特定字符出现两次或多次的特定行

标签 sed

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

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

最佳答案

你可以使用

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。第二部分中的 //p 匹配最新的模式,即匹配相同的 b[^b]*b 正则表达式。

请注意,如果您愿意,您也可以使用 b.*b 正则表达式,但括号表达式往往会更快。

查看 online demo ,使用 sed (GNU sed) 4.7 测试:

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 行。

关于sed - 打印特定字符出现两次或多次的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67952406/

相关文章:

sed - awk 和 sed 挑战 : adjust the text width

c - 将 C 代码中的左大括号移动到下一行?

regex - 对特殊字符使用 sed

bash - 替换多个模式,但不是用相同的字符串

sed - 使用 sed 替换字符串的多个变体

sed:H 和 D 的行为

bash - 每 2 个字节添加符号

date - 从日志文件中获取最后 5 分钟

linux - 仅在Linux中打印IP和设备名称

regex - 如何使用 sed 删除嵌套括号内的多个括号?