2012-05-21 125 views
2

我试图在属性文件中替换一行文本。 例如:Bash - sed替换文本

food.type=banana 

随着这行代码我可以取代香蕉完全与另一输入的输入。

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

输出:

food.type=apple 

然而,当我试图替换文本的前行中有一个/,我不能得到更换工作。 例如:

food.type=/yellow/banana 

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

+1

您必须用\ /或使用不同的分隔符来跳过斜线。 –

回答

5

的斜线被解读为关闭REG-EX匹配/替代模式,

sed "[email protected]=.*@[email protected]" 

一些SEDS需要你逃避非标准分隔符的第一个实例,即

sed "s\@food.type=.*@[email protected]" 

我希望这有助于。

+2

这里感兴趣的一点是,你可以用这种方式使用任何*字符作为他的正则表达式分隔符。其他常见选项包括'|','''和':',具体取决于要处理的文本。 – dmckee

+0

是的,好点。感谢分享。 – shellter

1

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

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

该变量代换是相当神秘,所以让我打破它由一块解释件:

${FOOD启动食品
的变量替换 //更换的
\/字符/(注意,必须在这方面进行转义)
/所有出现...
\/替换字符串\/(注意,这里的逃逸作为替换字符串的一部分,仅仅是处理)替代


}末但是,这并不完全是完美的,因为有可能引起麻烦的几个其他字符如果它们出现在替换字符串中。要真正防弹这一点,你可以做的几种替代在bash(乱),或农场的工作出来sed

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

再次,替代变得有点神秘,所以这里有一个细目:

s/更换模式
[\/&]任何字符\/的,或&
/与...
\\&替换字符串\(这里逃脱了),再加上原有的比赛
/g ...全局(即全部替换)

(是的,我知道用sed来准备的讽刺字符串,与sed一起使用。)

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