Bash-sed替换文本

Bash-sed替换文本,bash,sed,Bash,Sed,我正在尝试替换属性文件中的一行文本。 例如: food.type=banana food.type=/yellow/banana 有了这行代码,我可以用另一个输入完全替换香蕉 FOOD=apple sed "s/food.type=.*/food.type=$FOOD/" 输出: food.type=apple 但是,当我试图替换的前一行文本中有/时,我无法使替换工作正常进行。 例如: food.type=banana food.type=/yellow/banana 非常感谢您的

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

food.type=banana
food.type=/yellow/banana
有了这行代码,我可以用另一个输入完全替换香蕉

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

food.type=apple
但是,当我试图替换的前一行文本中有
/
时,我无法使替换工作正常进行。 例如:

food.type=banana
food.type=/yellow/banana

非常感谢您的帮助。谢谢

斜杠被解读为关闭reg ex匹配/替换模式

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

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

我希望这会有所帮助。

另一种选择是继续使用
/
作为sed的分隔符,并在替换字符串中转义任何斜杠。bash可以做到这一点(尽管它是一个复杂但神秘的工具):

变量替换相当隐晦,所以让我将其分解并逐一解释:

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

但这并不完全完美,因为如果替换字符串中出现其他几个字符,可能会导致问题。要真正做到这一点,您可以在bash(凌乱)中进行几次替换,也可以将作业分包到
sed

ESCAPEDFOOD="$(printf "%s" "$FOOD" | sed 's/[\/&]/\\&/g')"
sed "s/food.type=.*/food.type=$ESCFOOD/"
同样,替换变得有点神秘,所以这里有一个细分:

s/
更换图案
[\/&]
任何字符
\
/
&

/
与…
\\&
替换字符串
\
(此处转义),后跟原始匹配项
/g
…全局(即替换所有事件)

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


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

您必须使用\/来转义斜杠或使用不同的分隔符。这里的一个有趣之处是,您可以以这种方式使用任何字符作为正则表达式分隔符。其他常见的选择包括
\
,具体取决于要处理的文本。