在Unix中使用变量进行搜索和替换

时间:2014-01-03 13:33:40

标签: bash unix sed

我在目录中有一些XML文件,我正在尝试使用以下脚本将文本<value>hello</hello>替换为文本<value>helloWorld</value>

#!/bin/bash

VAR1=hello
VAR2=helloWorld

find ./myFolder/ -type f -exec sed -i 's/<value>$VAR1<\/value>/<value>$VAR2<\/value>/g' '{}' \;

如果我直接放置值而不是使用变量VAR1和VAR2,那么命令工作正常并正确替换文本。

但是当我使用上面脚本中显示的变量时,则不会发生替换。请让我知道我在哪里做错了?

3 个答案:

答案 0 :(得分:5)

如果要在字符串中包含shell变量,则应使用双引号:

find ./myFolder/ -type f -exec sed -i "s?<value>$VAR1</value>?<value>$VAR2</value>?g" '{}' \;

否则$VAR1将字面上理解为“$ VAR1”而不是“hello”,同样适用于$VAR2

我还将sed命令中的分隔符从s///更改为s???,以便在使用html标记时更具可读性。

答案 1 :(得分:2)

你应该在你的sed替换字符串周围使用双引号。

此外,VAR2前面没有$

find ./myFolder/ -type f -exec sed -i "s/<value>$VAR1<\/value>/<value>VAR2<\/value>/g" '{}' \;

答案 2 :(得分:1)

确保在sed command周围使用双引号以允许shell扩展变量:

find ./myFolder/ -type f -exec sed -i "s/<value>$VAR1<\/value>/<value>$VAR2<\/value>/g" '{}' \;