sed搜索替换模式(bash)

时间:2011-05-01 01:01:22

标签: bash search replace sed design-patterns

以下是我使用sed的一些示例文本(在bash,centos中)。我将文本分成几行,以便于阅读。 但下面的文字通常都在一行上。

  

一些文字   (Abc_3.7 | AUTODETECT |“} {\ fldrslt   \ plain \ f2 \ fs20 \ cf2 3:7}} \ plain   \ F2 \ FS20

     

Xyz_3.16 | AUTODETECT |“} {\ fldrslt   \ plain \ f2 \ fs20 \ cf2 16}} \ plain   \ f2 \ fs20更多文字,

     

Qr_3.11 | AUTODETECT |“} {\ fldrslt   \ plain \ f2 \ fs20 \ cf2 11}} \ plain   \ f2 \ fs20的东西

我想从每个条目中删除: | AUTODETECT |“} {\ fldrslt \ plain \ f2 \ fs20 \ cf2 3:7}}

\ plain和}} 之间的文字会有所不同,所以我需要选择所有内容。

这是我现在使用的代码:

s/|AUTODETECT|\"}{\\fldrslt \\plain .*}}/ /g;

问题。期待结果为:

Abc_3.7 \plain \f2\fs20 Xyz_3.16 \plain \f2\fs20 more text, Qr_3.11 \plain \f2\fs20 something

实际结果是:

Abc_3.7 \plain \f2\fs20

1 个答案:

答案 0 :(得分:1)

.*是贪婪的,并且匹配从“普通”到最后一对紧密括号之后的第一个数据,包括其他自动​​检测等等。您需要更精细(不太贪婪)的模式:

sed 's/|AUTODETECT|"}{\\fldrslt \\plain [^}]*}}/ /g' "$@"

'[^}]*'部分匹配除'}'(和换行符)之外的任意序列。


如果脚本需要进入文件,那么sed脚本文件包含:

s/|AUTODETECT|"}{\\fldrslt \\plain [^}]*}}/ /g

,调用变为:

sed -f sed.script "$@"

基本上,除了单引号之外的所有内容都会进入脚本文件。使用单引号的一个优点是可以减少担心逃逸。当脚本必须包含单引号时,您只会遇到任何问题。

相关问题