【问题标题】:Match word ignoring same word with extra character in sed匹配单词忽略sed中带有额外字符的相同单词
【发布时间】:2016-11-26 21:17:45
【问题描述】:

以下works in Javascript 匹配:

[^\$]fileref.*

但是,在 sed 中,正则表达式不匹配任何内容。我想在忽略变量标识符的同时替换 bash 文件中的变量引用。前提是我有一个默认占位符文件,需要使用 sed -i 从 shell 脚本进行更新。我找不到 sed 对此表达式有问题的原因。

Sed 测试示例:

echo -e 'fileref=old\n./executable $fileref' | sed 's/[^\$]fileref.*/fileref=replaced/g'

gnu sed(ubuntu 或 centOS)的输出,其中未找到匹配项:

fileref=old
./executable $fileref

期望的输出:

fileref=replaced
./executable $fileref

【问题讨论】:

  • sed 逐行工作,"fileref" 前没有字符。如果要匹配行首,请使用 ^ 锚点。顺便说一句,您不需要在字符类中转义 $

标签: regex bash shell sed


【解决方案1】:

fileref之前没有$可以这样表达:“一个不是$的字符或者在fileref之前根本没有字符”

echo -e 'fileref=old\n./executable $fileref' | sed 's/\([^$]\|^\)fileref.*/\1fileref=replaced/g'

与 Javascript 相同:

var result = str.replace(/([^$]|^)fileref.*/, '$1fileref=replaced');

【讨论】:

    【解决方案2】:
    echo -e 'fileref=old\n./executable $fileref' | sed 's/^fileref.*$/fileref=replaced/g'
    

    给出以下内容

    fileref=replaced
    ./executable $fileref
    

    输入 [^\$] 表示要在行首搜索 $

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-25
      • 1970-01-01
      • 2021-11-05
      • 1970-01-01
      • 1970-01-01
      • 2013-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多