Bash - 替换文本

时间:2012-05-21 16:56:47

标签: bash sed

我正在尝试替换属性文件中的一行文本。 例如:

food.type=banana

使用这行代码,我可以完全用另一个输入的输入替换banana。

FOOD=apple
sed "s/food.type=.*/food.type=$FOOD/" 

输出:

food.type=apple

然而,当我尝试替换的前一行文本中有/时,我无法让替换工作。 例如:

food.type=/yellow/banana

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:5)

斜线被视为关闭了reg-ex匹配/替换模式,

sed "s@food.type=.*@food.type=$FOOD@" 

某些seds要求您转义非标准分隔符的第一个实例,即

sed "s\@food.type=.*@food.type=$FOOD@" 

我希望这会有所帮助。

答案 1 :(得分:1)

另一个选择是继续使用/作为sed的分隔符,并转义替换字符串中的任何斜杠。 bash可以做到这一点(虽然它只是一个但很神秘):

sed "s/food.type=.*/food.type=${FOOD//\//\/}/"

变量替换是相当神秘的,所以让我分解一下解释它:

${FOOD开始变量替换FOOD
//替换所有出现的 \/字符/(请注意,必须在此上下文中进行转义)
/与...... \/替换字符串\/(请注意,此处的转义仅被视为替换字符串的一部分)
}替代结束

但这并不完全是完美的,因为如果它们出现在替换字符串中,还有其他几个字符可能会造成麻烦。要真正防止这种情况发生,您可以在bash(杂乱)中进行多次替换,或将作业移植到sed

ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')"
sed "s/food.type=.*/food.type=$ESCFOOD/"

同样,替换变得有点神秘,所以这是一个细分:

s/替换图案
[\/&]任意字符\/&
/与...... \\&替换字符串\(在此处转义)后跟原始匹配
/g ...全局(即替换所有出现次数)

(是的,我知道使用sed准备字符串以便与sed一起使用具有讽刺意义。)

请注意,我可能错过了一些麻烦的角色;如果是这样,可以将它们添加到[]表达式中。