2011-05-01 101 views
1

这里是我使用sed(在bash,centos中)的一些示例文本。我已将文本分成几行以便于阅读。 但下面的文本通常都在一行上。Sed搜索替换模式(bash)

一些文本 (Abc_3.7 | AUTODETECT |“} {\ fldrslt \平原\ F2 \ FS20 \ CF2 3:7}} \平原 \ F2 \ FS20

Xyz_3 0.16 | AUTODETECT | “} {\ fldrslt \平原\ F2 \ FS20 \ CF2 16}} \平原 \ F2 \ FS20多个文本,

Qr_3.11 | AUTODETECT |”} {\ fldrslt \平\ F2 \ FS20 \ CF2 11}} \平原 \ F2 \ FS20东西

我想从每个条目剥离: | AUTODETECT |“} {\ fldrslt \平\ F2 \ FS20 \ CF2 3:7}}

\平原}}之间的文本可能会有所不同,所以,我需要选择一切

。以下是我现在使用的代码:

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

.*是贪婪和之后“平原”到最后一对右括号的,包括其他的自动检测等从第一数据匹配的一切你需要一个更精致的(贪心不足)模式:

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

的“[^}]*”的一部分的任何一个任意序列匹配除“}”(和换行)。


如果脚本需要在一个文件中去,然后sed脚本文件包含:

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

和调用变为:

sed -f sed.script "[email protected]" 

基本上,除了单引号一切进入脚本文件。使用单引号的优点之一是不用担心逃跑。当脚本必须包含单引号时,您只会遇到任何问题。

+0

哇,谢谢,效果很好。我如何修改你的代码把它放到我的.sed文件中?我迄今为止使用sed文件的经验是它不喜欢引用... – 2011-05-01 01:39:30

+0

非常感谢Jonathon。 – 2011-05-01 02:03:44