使用sed用花括号替换文本

时间:2014-04-29 02:08:41

标签: unix replace sed

我想找到以下文字

get_pins {

并将其替换为

get_pins -hierarchical {proc_top_*/

我已尝试使用sed,但我不确定自己做错了什么。我知道你需要在大括号前面使用,但我仍然无法让命令正常工作。

我最接近的是:

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

但它没有做我上面想要的替换。

3 个答案:

答案 0 :(得分:2)

问题不在花括号中,而在/中。

这正是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

答案 1 :(得分:2)

@ merlin2011的答案向您展示了如何使用其他分隔符进行操作,但至于为什么您的命令无法正常工作:

如果您只删除所有#个字符,那么它实际上非常好。来自你的陈述:

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

此处涉及两个不同的转义要求

  • 转义正则表达式分隔符的字面用法:这是您正确执行的操作,将/转义为\/
  • 在一般的正则表达式中转义具有特殊含义的字符此转义总是使用\ - 前缀完成,但是在您的情况下,不需要进行此类转义:因为您不使用-E-r来表示使用扩展正则表达式 - 因此使用< em> basic 正则表达式 - {实际上不是特殊字符,因此您无需逃避它。相反,如果您使用了-E-r),那么您应该将{转义为\{

答案 2 :(得分:0)

这个awk应该替换:

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