在sed中查找和替换变量中的特定字符

问题描述:

问题:我有一个带字符的变量我想在存储在一个变量中的同一个字符串中添加另一个字符在sed中查找和替换变量中的特定字符

Ex。 “[blahblahblah]” ---> “\ [blahblahblah \]”

目前的解决方案:目前,我完成我想有两个步骤,每一步攻击一个支架

例。

temp=[blahblahblah] 
firstEscaped=$(echo $temp | sed s#'\['#'\\['#g) 
fullyEscaped=$(echo $firstEscaped | sed s#'\]'#'\\]'#g) 

这给我我想要的结果,但我觉得我可以在一行中使用capturing groups做到这一点。我只是没有运气,我正在被烧毁。我遇到的大多数例子都涉及到想要提取括号内的文本,而不是我想要做的。 This是我的最新尝试无济于事。有任何想法吗?

可能有更有效的方式,(仅1 s/s/r/与票友REG-EX),但是这个作品,给你的样品输入

fully=$(echo "$temp" | sed 's/\([[]\)/\\\1/;s/\([]]\)/\\\1/') ; echo "$fully" 

输出

\[blahblahblah\] 

注意将多个sed操作链接在一起相当不错,该操作由;分隔,或者如果在sed脚本文件中,则以空行分隔。

阅读关于sed捕获组使用\(...\)对,并引用它们的编号,即\1

IHTH

$ temp=[blahblahblah]  
$ fully=$(echo "$temp" |sed 's/\[\|\]/\\&/g'); echo "$fully" 
\[blahblahblah\] 

简要说明,

  • \[\|\]:目标替代 '[' 或 ']',而对于 '[', ']' 和 '|'需要逃脱。
  • &:字符&指的是匹配的模式,并且介意它也需要被转义。

由于@Gordon戴维森的建议,你也可以使用括号表达式,以避免扩展格式的正则表达式,

sed 's/[][]/\\&/g' 
+1

您需要双击报价'$ temp'防止分词和通配符扩展。请注意,'[]'是一个shell通配符,所以它可能会意外扩展。 –

+0

是的,你是对的。这是从OP复制,并将修改此。 – CWLiu

+1

我也只是注意到你正在使用的正则表达式是扩展格式(使用'|'来分隔可选项)。除非使用'sed -r'(GNU sed)或'sed -E'(BSD sed),否则这通常不起作用。它可能会更好使用括号表达式(尽管包含括号的括号表达式很棘手)。 'sed's/[] []/\\&g''应该可以工作。 –