我试图在属性文件中替换一行文本。 例如:Bash - sed替换文本
food.type=banana
随着这行代码我可以取代香蕉完全与另一输入的输入。
FOOD=apple
sed "s/food.type=.*/food.type=$FOOD/"
输出:
food.type=apple
然而,当我试图替换文本的前行中有一个/
,我不能得到更换工作。 例如:
food.type=/yellow/banana
任何帮助,非常感谢。谢谢!
我试图在属性文件中替换一行文本。 例如:Bash - sed替换文本
food.type=banana
随着这行代码我可以取代香蕉完全与另一输入的输入。
FOOD=apple
sed "s/food.type=.*/food.type=$FOOD/"
输出:
food.type=apple
然而,当我试图替换文本的前行中有一个/
,我不能得到更换工作。 例如:
food.type=/yellow/banana
任何帮助,非常感谢。谢谢!
的斜线被解读为关闭REG-EX匹配/替代模式,
做
sed "[email protected]=.*@[email protected]"
一些SEDS需要你逃避非标准分隔符的第一个实例,即
sed "s\@food.type=.*@[email protected]"
我希望这有助于。
另一种选择是继续使用/
作为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
一起使用。)
请注意,这可能是我错过了一些麻烦的字符;如果是这样,他们可以被添加到[]
表达式中。
您必须用\ /或使用不同的分隔符来跳过斜线。 –