Sed 搜索替换模式 (bash)

发布于 2024-11-04 11:09:16 字数 900 浏览 0 评论 0原文

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

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

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

Qr_3.11|自动检测|"}{\fldrslt \普通\f2\fs20\cf2 11}}\普通 \f2\fs20 东西

我想从每个条目中删除的内容: |自动检测|"}{\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

Here is some sample text I'm using with sed (in bash, centos). I've broken the text into lines to make it easier to read. But the text below is usually all on one line.

some text
(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 more text,

Qr_3.11|AUTODETECT|"}{\fldrslt
\plain \f2\fs20\cf2 11}}\plain
\f2\fs20 something

I want to strip from each entry: |AUTODETECT|"}{\fldrslt \plain \f2\fs20\cf2 3:7}}

The text between \plain and }} will vary, so I need to select everything.

Here's the code I'm using now:

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

The problem. I expect the results to be:

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

But the actual results are:

Abc_3.7 \plain \f2\fs20

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

悲欢浪云 2024-11-11 11:09:18

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

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

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


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

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

并且调用变为:

sed -f sed.script "$@"

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

The .* is greedy and matches everything from the first data after 'plain' up to the last pair of close braces, including the other auto-detects etc. You need a more refined (less greedy) pattern:

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

The '[^}]*' part matches an arbitrary sequence of anything except '}' (and newline).


If the script needs to go in a file, then the sed script file contains:

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

and the invocation becomes:

sed -f sed.script "$@"

Basically, everything except the single quotes go into the script file. One of the advantages of using single quotes is that there is less to worry about with escapes. You only run into any problems when the script has to contain single quotes.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文