匹配单词忽略sed中带有额外字符的相同单词

Posted

技术标签:

【中文标题】匹配单词忽略sed中带有额外字符的相同单词【英文标题】:Match word ignoring same word with extra character in 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" 前没有字符。如果要匹配行首,请使用 ^ 锚点。顺便说一句,您不需要在字符类中转义 $ 【参考方案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

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

【讨论】:

以上是关于匹配单词忽略sed中带有额外字符的相同单词的主要内容,如果未能解决你的问题,请参考以下文章

SQLite:一个单词中的FTS匹配可以忽略哪个字符

正则表达式用于检查单词中间的额外空格(多个)[重复]

当有足够的空间时,UILabel 自动换行会在下一行添加额外的单词

英文单词排序

第五周 英文单词排序

使用 sed/awk 仅打印包含匹配模式的单词 - 以 /pattern/ 开头或以 /pattern/ 结尾的单词