sed通配符替换

时间:2011-06-06 22:14:13

标签: regex sed grep wildcard string-substitution

我想基于通配符进行替换。例如,只有当“任期”一词出现在“=”符号后面时,才将所有“任期”改为“处置”。基本上是一个匹配此=.*tenure

的正则表达式

我这样做的sed命令是:

sed 's/=.*tenure/=.*disposition/g' file.txt

但是,如果我将其传递给包含以下内容的文件

blah blah blah = change "tenure" to "disposition"

我得到了

blah blah blah =.*disposition" to "disposition"

而不是:

blah blah blah = change "disposition" to "disposition"

如何进行替换,使正则表达式中的通配符不会成为目标文件的一部分?

4 个答案:

答案 0 :(得分:7)

您需要使用捕获组来捕获等号与“任期”之间出现的文字。

所以

sed 's/=\(.*\)tenure/=\1disposition/g'

请注意使用\1来引用和使用您捕获的群组。

所以在

echo 'blah blah blah = change "tenure" to "disposition"' | sed 's/=\(.*\)tenure/=\1disposition/g'

我们得到了

blah blah blah = change "disposition" to "disposition".

请参阅Regex grouping

答案 1 :(得分:2)

sed 's/\(=.*\)tenure/\1disposition/g' file.txt

答案 2 :(得分:2)

您需要在=tenure之间保存匹配的字符,以便将它们添加到输出中:

sed 's/=(.*)tenure/=\1disposition/g' file.txt

此外,如果要在内部编辑文件,则应将-i选项添加到sed(对文件本身进行修改)。

答案 3 :(得分:2)

你必须在sed中使用backreference。像这样使用它:

sed 's/\(=.*\)tenure/\1disposition/g'