提取字符串之间的文本

发布于 2024-09-15 13:04:51 字数 227 浏览 3 评论 0原文

如何从充满这些行的文件中提取具有非常特定模式的字符串之间的文本?例如:

input:a_log.gz:make=BMW&year=2000&owner=Peter

我想从本质上捕获 make=BMW&year=2000 部分。我知道该行可以以“input:(任意数量的字符).gz:”开头,以“owner=Peter”结尾

How do I extract text in between strings with very specific pattern from a file full of these lines? Ex:

input:a_log.gz:make=BMW&year=2000&owner=Peter

I want to essentially capture the part make=BMW&year=2000. I know for a fact that the line can start out as "input:(any number of characters).gz:" and end with "owner=Peter"

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

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

发布评论

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

评论(5

尛丟丟 2024-09-22 13:04:51

使用正则表达式:input:.*?\.gz:(.*?)&?owner=Peter。捕获将包含第二个冒号和“owner=Peter”之间的内容,并修剪&符号。

Use the regex: input:.*?\.gz:(.*?)&?owner=Peter. The capture will contain the things between the second colon and "owner=Peter", trimming the ampersand.

大海や 2024-09-22 13:04:51

尝试一下:

sed -n 's/.*:\([^&]*&[^&]*\)&.*/\1/p' file

这将提取第二个冒号和第二个&符号之间的所有内容,无论之前和之后的内容(如果有更多冒号或&符号,它可能无法正常工作)。

Give this a try:

sed -n 's/.*:\([^&]*&[^&]*\)&.*/\1/p' file

This will extract everything between the second colon and the second ampersand regardless of what's before and after (if there are more colons or ampersands it may not work properly).

烟燃烟灭 2024-09-22 13:04:51

你可以使用 shell(bash/ksh)

$ s="input:a_log.gz:make=BMW&year=2000&owner=Peter"
$ s=${s##*gz:}
$ echo ${s%%owner=Peter*}
make=BMW&year=2000&

如果你想要 sed

$ echo ${s} | sed 's/input.*gz://;s/owner=Peter//'
make=BMW&year=2000&

you can use the shell(bash/ksh)

$ s="input:a_log.gz:make=BMW&year=2000&owner=Peter"
$ s=${s##*gz:}
$ echo ${s%%owner=Peter*}
make=BMW&year=2000&

if you want sed

$ echo ${s} | sed 's/input.*gz://;s/owner=Peter//'
make=BMW&year=2000&
花海 2024-09-22 13:04:51
>echo "input:a_log.gz:make=BMW&year=2000&owner=Peter"|sed -e "s/input:.*.gz://g" -e "s/&owner.*//g"
make=BMW&year=2000
>echo "input:a_log.gz:make=BMW&year=2000&owner=Peter"|sed -e "s/input:.*.gz://g" -e "s/&owner.*//g"
make=BMW&year=2000
余生一个溪 2024-09-22 13:04:51

我没有看到使用 awk 的答案:

awk '{ match($0, /input:.*\.gz:/);
       m = RSTART+RLENGTH;
       n = index($0, "&owner=Peter") - m;
       print substr($0,m,n)
     }'

该方法是 sh 版本(按参数扩展的子字符串)和 sed 之间的混合>(正则表达式)版本。这是因为 awk RE 缺乏反向引用。

I didn't see an answer using awk:

awk '{ match($0, /input:.*\.gz:/);
       m = RSTART+RLENGTH;
       n = index($0, "&owner=Peter") - m;
       print substr($0,m,n)
     }'

The method is sort of a mix between the sh version (substring by parameter expansions) and the sed (regular expressions) versions. This is because awk RE's lack backreferences.

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