【问题标题】:How can I fix the following sed command?如何修复以下 sed 命令?
【发布时间】:2015-08-16 11:24:35
【问题描述】:

我正在尝试将_out 附加到与以下 sed 命令中显示的正则表达式匹配的任何内容。 _out 应该在 [ (] 之前。

sed -n '/[^_]lm[01?]_.*[ (]/p'

该命令按我的预期正确返回行。现在问题来了,当我尝试以下命令时,我定义了要在替换中使用的区域。

例如,如果我匹配 lm?_whatever(,则应将其替换为 lm?_whatever_out(

我用过

sed 's/\([^_]lm[01?]_.*\)\([ (]\)/\1_out\2/g' text_to_edit

正如你可能猜到的那样,我很不走运。我做错了什么?

编辑:

这是一个解释更多的例子:

正文:

this will make absolutely no sense=lm?_hello <= four_lm1_hi(5:0) bla bla
lm1_blabbering(5:0) 

应该变成

this will make absolutely no sense=lm?_hello_out <= four_lm1_hi(5:0) bla bla
lm1_blabbering_out(5:0) 

【问题讨论】:

  • 发布一些示例输入和所需的输出,我们不应该破译这个正则表达式:)
  • 你的第二个正则表达式是_.*,而第一个是_*.。重大变化!
  • 是因为[^_]。去掉它。你真的需要它吗?
  • @Vincent 我的第一个正则表达式在我复制时是拼写错误,我的问题仍然存在。
  • @stribizhev,我想我知道了,我还能怎么做呢?否则在上面的例子中four_lm1_hi(5:0) 将被替换。不过,否定在第一个命令中起作用。

标签: regex linux unix replace sed


【解决方案1】:

为了只匹配你的lm 单词而不影响后面的单词,你需要限制模式。我建议将 .* 转为 [^[:blank:]]* 以匹配 0 个或更多字符,而不是空格或制表符

sed 's/\([^_]lm[01?]_[^[:blank:]]*\)\([ (]\)/\1_out\2/g' text_to_edit

(编辑) 或者,如果 _ 之间的唯一字符是字母数字字符,您可以使用 [[:alnum:]] 字符类:

sed 's/\([^_]lm[01?]_[[:alnum:]_]*\)\(.\)/\1_out\2/g' text_to_edit

这样,我们将确保只有 lm?_hellolm1_blabbering 匹配。

【讨论】:

  • 请告诉我你遇到了什么错误。
  • 错误很简单(不完整的例子是我的错),没有什么我想不通的。你解决了主要问题。谢谢
  • sed 's/\([^_]lm[01?]_[[:alnum:]_]*\)\(.\)/\1_out\2/g' text_to_edit 最适合我
猜你喜欢
  • 2016-11-21
  • 2021-04-28
  • 2020-04-03
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2021-09-24
  • 2019-11-09
  • 1970-01-01
相关资源
最近更新 更多