以下是我使用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
答案 0 :(得分:1)
.*
是贪婪的,并且匹配从“普通”到最后一对紧密括号之后的第一个数据,包括其他自动检测等等。您需要更精细(不太贪婪)的模式:
sed 's/|AUTODETECT|"}{\\fldrslt \\plain [^}]*}}/ /g' "$@"
'[^}]*
'部分匹配除'}'(和换行符)之外的任意序列。
如果脚本需要进入文件,那么sed脚本文件包含:
s/|AUTODETECT|"}{\\fldrslt \\plain [^}]*}}/ /g
,调用变为:
sed -f sed.script "$@"
基本上,除了单引号之外的所有内容都会进入脚本文件。使用单引号的一个优点是可以减少担心逃逸。当脚本必须包含单引号时,您只会遇到任何问题。