【问题标题】:Sed search replace pattern (bash)Sed 搜索替换模式 (bash)
【发布时间】:2011-08-16 06:46:07
【问题描述】:

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

一些文字 (Abc_3.7|自动检测|"}{\fldrslt \plain \f2\fs20\cf2 3:7}}\plain \f2\fs20

Xyz_3.16|自动检测|"}{\fldrslt \plain \f2\fs20\cf2 16}}\plain \f2\fs20 更多文字,

Qr_3.11|自动检测|"}{\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

【问题讨论】:

    标签: bash search replace sed design-patterns


    【解决方案1】:

    .* 是贪婪的,它匹配从“plain”之后的第一个数据到最后一对右大括号的所有内容,包括其他自动​​检测等。您需要一个更精致(不那么贪婪)的模式:

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

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


    如果脚本需要放到一个文件中,那么sed脚本文件包含:

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

    然后调用变成:

    sed -f sed.script "$@"
    

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

    【讨论】:

    • 哇,谢谢,效果很好。我将如何修改您的代码以将其放入我的 .sed 文件中?到目前为止,我对 sed 文件的体验是它不喜欢引号......
    猜你喜欢
    • 1970-01-01
    • 2017-08-02
    • 2014-09-13
    • 2021-11-27
    • 2021-02-18
    • 2014-06-08
    • 2017-08-09
    • 1970-01-01
    • 2011-08-16
    相关资源
    最近更新 更多