【问题标题】:Find and Replace Specific characters in a variable with sed使用 sed 查找和替换变量中的特定字符
【发布时间】:2017-10-18 03:40:40
【问题描述】:

问题:我有一个带有字符的变量,我想在存储在变量中的同一字符串中添加另一个字符

例如。 "[blahblahblah]" ---> "\[blahblahblah\]"

当前解决方案:目前我通过两个步骤完成我想要的,每个步骤都攻击一个括号

例如

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

这给了我想要的结果,但我觉得我可以使用capturing groups 在一行中完成此操作。我只是没有运气,我已经筋疲力尽了。我遇到的大多数示例都涉及想要提取括号之间的文本,而不是我想要做的事情。 This 是我最新的尝试,但无济于事。有什么想法吗?

【问题讨论】:

    标签: regex linux bash sed capturing-group


    【解决方案1】:

    可能有更有效的方法,(只有 1 个 s/s/r/ 带有更高级的 reg-ex),但是根据您的示例输入,这可行

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

    输出

    \[blahblahblah\]
    

    请注意,将多个sed 操作链接在一起是完全可以的,由; 分隔,或者如果在sed 脚本文件中,则由空行分隔。

    了解使用\(...\) 对的sed 捕获组,并按编号引用它们,即\1。

    IHTH

    【讨论】:

      【解决方案2】:
      $ temp=[blahblahblah]    
      $ fully=$(echo "$temp" |sed 's/\[\|\]/\\&/g'); echo "$fully"
      \[blahblahblah\]
      

      简要说明,

      • \[\|\]:目标替换为 '[' 或 ']',以及 '['、']' 和 '|'需要转义。
      • &:字符& 表示匹配的模式,注意它也需要转义。

      根据@Gordon Davisson 的建议,您也可以使用括号表达式来避免扩展格式正则表达式,

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

      【讨论】:

      • 您需要双引号$temp 以防止分词和通配符扩展。请注意,[ ] 是一个 shell 通配符,因此它可能会意外扩展。
      • 是的,你是对的。这是从 OP 复制的,并将对其进行修改。
      • 我也刚刚注意到您使用的正则表达式是扩展格式(使用| 分隔替代方案)。除非您使用 sed -r (GNU sed) 或 sed -E (BSD sed),否则这通常是行不通的。使用括号表达式可能会更好(尽管包含括号的括号表达式......很棘手)。 sed 's/[][]/\\&/g' 应该可以工作。
      • 非常好。 @GordonDavisson 我会将您的建议添加到我的答案中作为补充。
      • 我在时髦的环境中尝试了s/[][]/\\&/g,但没有成功。这就是为什么我选择了 2 次通行证,但很高兴知道 [][] 可以工作。祝大家好运。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-23
      • 2014-10-28
      • 1970-01-01
      • 2017-07-15
      • 2011-09-04
      • 1970-01-01
      相关资源
      最近更新 更多