我想基于通配符进行替换。例如,只有当“任期”一词出现在“=”符号后面时,才将所有“任期”改为“处置”。基本上是一个匹配此=.*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"
如何进行替换,使正则表达式中的通配符不会成为目标文件的一部分?
答案 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'