【问题标题】:Bash: sed regex pattern won't match stringsBash:sed 正则表达式模式不会匹配字符串
【发布时间】:2015-05-12 21:47:13
【问题描述】:

我已经在 RegExr.com 中测试了这个特殊的正则表达式:

/(\*)*((\s)?(\w)*)/g

匹配以下内容:

* Global Links contained...etc
* Change User, contact list...etc

(从...开始的所有内容都只是句子中的多余单词,而不是文字...等)

我尝试在 sed 命令中使用此正则表达式作为 bash 脚本的一部分,如下所示:

sed "/(\*)*((\s)?(\w)*)/d" test.txt > stripped.txt

但是这两行仍然保留在 stripped.txt 中。正则表达式或文件中是否有我没有考虑的内容?在这两行之前是块注释(/**)的开始,块注释结束在它们之后(*/),它们都在新行上。我是否遗漏了一些新行或 sed 命令/正则表达式错误的东西?

【问题讨论】:

  • < 应该是 (。您是复制并粘贴了正则表达式还是拼写错误?
  • 只是一个错字,我已经更正了这个
  • 使用-r 扩展正则表达式语法(或转义()?)。但是那个正则表达式真的是你想要的吗?它将匹配每一行,因为其中的所有内容都匹配空字符串。
  • 所以你基本上想要/^\*.*/d? (即“任何以* 开头的行)
  • 不一定,这是一个简单的脚本,可以将 css 中的 block cmets 剥离为 txt 文件,但可能存在 * { //css stuff } 之类的规则

标签: regex bash shell sed


【解决方案1】:

默认情况下,您没有考虑 sed 使用的正则表达式方言。这不是一个有效的 BRE(基本正则表达式)。

您需要告诉 sed 使用 ERE(扩展正则表达式)。

对于 GNU sed 是 -r 标志,对于 BSD sed 是 -E 标志(尽管 -r 通常可用作兼容标志)。

sed -r "/(\*)*((\s)?(\w)*)/d" test.txt > stripped.txt

【讨论】:

  • 用丹泽尔华盛顿 ala American Gangster - My Man 的话来说。又一个没有正确阅读文档的案例,谢谢
  • Unix SE 中的这个答案很好地解释了不同的正则表达式语法:unix.stackexchange.com/a/119906/1199
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
相关资源
最近更新 更多