我正在尝试替换属性文件中的一行文本。 例如:
food.type=banana
使用这行代码,我可以完全用另一个输入的输入替换banana。
FOOD=apple
sed "s/food.type=.*/food.type=$FOOD/"
输出:
food.type=apple
然而,当我尝试替换的前一行文本中有/
时,我无法让替换工作。
例如:
food.type=/yellow/banana
非常感谢任何帮助。谢谢!
答案 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
一起使用具有讽刺意义。)
请注意,我可能错过了一些麻烦的角色;如果是这样,可以将它们添加到[]
表达式中。