我想使用sed进行替换,但不是通过搜索要替换的内容。
请允许我解释一下。我最初将变量设置为默认值。
VARIABLE="DEFAULT"
我可以用一个sed来取代我想要的DEFAULT,但是当我完成时我将不得不放回DEFAULT。这是因为存储到VARIABLE的内容对于用户来说是唯一的。我想用sed搜索除了替换之外的其他东西。例如,搜索VARIABLE =“和”并替换它之间的什么。这样它只是不断更新,无需重置VARIABLE。
这就是我目前的做法:
我调用脚本并传递参数
./script 123456789
在脚本中,这就是:
sed -i "s%DEFAULT%$1%" file_to_modify
这取代了
VARIABLE="DEFAULT"
与
VARIABLE="123456789"
如果我不必搜索“DEFAULT”会很好,因为那时我不必在脚本结束时重置VARIABLE。
答案 0 :(得分:1)
sed -r 's/VARIABLE="[^"]*"/VARIABLE="123456789"/' file_to_modify
或者,更一般地说:
sed -r 's/VARIABLE="[^"]*"/VARIABLE="'"$1"'"/' file_to_modify
以上两个都使用正则表达式来查找'VARIABLE =“any-at-all”'并将其替换为上面的第一个例子'VARIABLE =“123456789”'或者,在第二个例子中,'VARIABLE =“$ 1”'其中“$ 1”是脚本的第一个参数。关键要素是[^"]
。它表示除双引号之外的任何字符。 [^"]*
表示除双引号之外的任意数量的字符。因此,我们使用新值"[^"]*"
或第二种情况"123456789"
替换之前双引号中的任何内容"$1"
。
第二种情况有点棘手。我们希望将$1
替换为表达式,但表达式本身是单引号。在单引号内,bash不会替代$1
。因此,sed命令分为三个部分:
# spaces added for exposition but don't try to use it this way
's/VARIABLE="[^"]*"/VARIABLE="' "$1" '"/'
第一部分是单引号,bash将字面意思传递给sed。第二部分是双引号,所以bash将替换为`$``的值。第三部分是单引号,并按字面意思传递给sed。
更多信息:这是一种在命令行上测试此方法而不依赖于任何文件的简单方法:
$ new=1234 ; echo 'VARIABLE="DEFAULT"' | sed -r 's/VARIABLE="[^"]*"/VARIABLE="'"$new"'"/'
VARIABLE="1234"
上面的第一行是在提示符($
)处运行的命令。第二个是运行命令的输出..