sed部分替换或变量

时间:2014-01-10 22:30:19

标签: bash replace sed

我想使用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。

1 个答案:

答案 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"

上面的第一行是在提示符($)处运行的命令。第二个是运行命令的输出..