首页 > 解决方案 > 我怎么能用 grep 排除一行?

问题描述

对不起我的初学者问题:我想 grep .md 文件中的链接,除了一个特殊的行,它以一个特殊的词开头。

所以我的 index.md 看起来像:

[Test](202001-test)
BlaBla: [Test2]((202002-test2)

我的代码如下所示:

grep -Eo '\[.*\]\([2].*\)' ~/script/index.md

那么我应该写什么,那个 grep 忽略第二行?在正则表达式网站上找不到答案。

问候

标签: grep

解决方案


假设重点是匹配[...](2...)不包含额外的子字符串,[]方括号内和(/)在括号之间,如果你想避免匹配以 开头的字符串BlaBla:,你可以考虑使用

grep -v '^BlaBla:' index.md | grep -o '\[[^][]*](2[^()]*)'

在这里,grep -v '^BlaBla:'用 option 反转匹配-v并输出所有不以 . 开头的行BlaBla:。然后,第二个grep获得必要的有效匹配。

POSIX BRE 模式细节

  • \[- 一个[字符
  • [^][]*[- 除了and之外的零个或多个字符]
  • ]- 一个]字符
  • (2- 一个(2子串
  • [^()]*- 0 个或多个字符,而不是(and)
  • )- 一个)字符。

在线grep演示

s='[Test](202001-test)
BlaBla: [Test2]((202002-test2)'
grep -v '^BlaBla:' <<< "$s" | grep -o '\[[^][]*](2[^()]*)'

输出:

[Test](202001-test)

推荐阅读