【问题标题】:Using sed to replace text with curly braces使用 sed 用大括号替换文本
【发布时间】:2014-06-14 18:39:45
【问题描述】:

我正在寻找以下文字

get_pins {

替换成

get_pins -hierarchical {proc_top_*/

我尝试过使用sed,但我不确定我做错了什么。我知道您需要在花括号前面加上 #,但我仍然无法让命令正常工作。

我最接近的是这个:

sed 's/get_pins #{#/get_pins -hierarchical #{#proc_top_*\//g' filename.txt > output

但它并没有完成我上面想要的替换。

【问题讨论】:

  • 为什么要用# 括起来{?这是不正确的。
  • @starbox,查看更新的答案。我刚刚用csh 测试并重现了你的问题。

标签: unix replace sed


【解决方案1】:

问题不在于花括号,而在于/

这正是sed 允许您使用备用分隔符的原因。

下面的行使用! 作为分隔符,并且对于其中包含get_pins { 的简单文件正常工作。

sed 's!get_pins {!get_pins -hierarchical {proc_top_*/!g' Input.txt

输出:

get_pins -hierarchical {proc_top_*/

更新:基于 mklement0 的评论,并使用 csh shell 进行测试,以下内容应在 csh 中工作。

sed 's@get_pins {@get_pins -hierarchical {proc_top_*/@g' Input.txt

【讨论】:

  • 我的输出是:get_pins: Event not found
  • @starbox 什么版本的 sed 和哪个平台?
  • @starbox:听起来您正在使用[t]csh,命令行的所谓历史扩展功能妨碍了您 - 尝试替换所有! 字符。例如,@ 字符。
  • csh 是否认真尝试扩展单引号中的字符?
  • @Sigi,根据我的测试,是的。这可能是 bash 现在更受欢迎的原因之一。
【解决方案2】:

@merlin2011 的回答向您展示了如何使用替代分隔符来做到这一点,但至于您的命令为什么不起作用:

如果您删除所有 # 字符,这实际上非常好。来自您的陈述:

sed 's/get_pins {/get_pins -hierarchical {proc_top_*\//'g filename.txt > output

这里涉及到两个不同的转义要求

  • 转义正则表达式的文字使用分隔符:这是您正确的做法,将/ 转义为\/
  • 转义具有特殊含义的字符一般在正则表达式中这种转义总是使用\-prefixing完成,但在您的情况下不需要这种转义:因为您没有使用 -E-r 来指示使用 extended 正则表达式 - 因此使用 basic 正则表达式- { 实际上不是一个特殊字符,所以你不需要转义它。相反,如果您使用了-E (-r),那么您应该将{ 转义为\{

【讨论】:

    【解决方案3】:

    这个awk 应该做替换:

    awk '{sub(/get_pins {/,"get_pins -hierarchical {proc_top_*/")}1'
    

    【讨论】:

    • 有时,awk 的答案是 sed 问题的一个令人耳目一新的对立面 - 这不是其中一种情况:这只是稍微冗长和棘手(1 以确保输入即使没有匹配行也会打印)sed 命令的版本;应该指出,(固定的)sed 命令是解决手头问题的完美解决方案。
    • @mklement0 我错过了大括号,如果不需要,我肯定不会使用1。这和sed 一样好。 OP 确实提到过您确实尝试过sed,而不是说他只需要sed 的解决方案。
    • 现在你让它变得更详细了——如果没有大括号它也可以工作(显然,当awk 发现多个模式在没有相关操作的情况下评估为真时,它仍然只打印 (可能修改)仅行一次);回顾一下我的观点:使用不同于 OP 要求的工具的解决方案 可以 是一个令人耳目一新的选择,但你的不是。
    • @mklement0 OP 并没有说他需要对每一行进行多次替换,如果是这样,请从 sub 更改为 gsub。我通常使用大括号和1 来打印它,而不仅仅是测试。它使它更加健壮。如果行以0 开头,它可能会因测试而失败。您好尝试使用sed 并无法使其正常工作。所以我没有看到任何错误的帖子awk 解决方案。
    • 我从来没有打算谈论 多个 替换每行 - 如果我给了我这样的印象,对不起。使用 1 作为单独的模式,sub() 返回什么并不重要(记录:如果进行了替换,则返回 1,否则返回 0)。撇开花括号不谈,对1(或更冗长的等价物{print},如果在sub() 周围使用花括号)的需求凸显了尴尬:sed 通过 all 行默认情况下,无论是否修改,而您必须做额外的工作——无论多么少——才能在awk中实现这一点。
    猜你喜欢
    • 2016-11-25
    • 2012-08-25
    • 2020-12-13
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 2023-03-02
    相关资源
    最近更新 更多