gpt4 book ai didi

perl - 使用 sed、awk 或 perl 从行中提取特定模式

转载 作者:行者123 更新时间:2023-12-02 16:48:50 25 4
gpt4 key购买 nike

如果我需要提取由特定模式包围的模式(如果该模式存在于一行中),我可以使用 sed 吗?

假设我有一个包含以下几行的文件:

There are many who dare not kill themselves for [/fear/] of what the neighbors will say.

Advice is what we ask for when we already know the /* answer */ but wish we didn’t.

在这两种情况下,我都必须扫描该行以查找第一个出现的模式,即“[/”或“/*”(在各自的情况下)并存储以下内容模式直到退出模式,即分别为“/]”或“*/”。

简而言之,我需要fearanswer。如果可能的话,是否可以将其扩展到多行;从某种意义上说,如果退出模式出现在不同的行中比相同。

欢迎以建议或算法的形式提供任何形式的帮助。先谢谢各位的回复

最佳答案

use strict;
use warnings;

while (<DATA>) {
while (m#/(\*?)(.*?)\1/#g) {
print "$2\n";
}
}


__DATA__
There are many who dare not kill themselves for [/fear/] of what the neighbors will say.
Advice is what we ask for when we already know the /* answer */ but wish we didn’t.

作为一句台词:

perl -nlwe 'while (m#/(\*?)(.*?)\1/#g) { print $2 }' input.txt

内部 while 循环将在所有带有 /g 修饰符的匹配之间进行迭代。反向引用 \1 将确保我们只匹配相同的打开/关闭标记。

如果您需要匹配跨越多行的 block ,则需要吸收输入:

use strict;
use warnings;

$/ = undef;
while (<DATA>) {
while (m#/(\*?)(.*?)\1/#sg) {
print "$2\n";
}
}

__DATA__
There are many who dare not kill themselves for [/fear/] of what the neighbors will say. /* foofer */
Advice is what we ask for when we already know the /* answer */ but wish we didn’t.
foo bar /
baz
baaz / fooz

一行:

perl -0777 -nlwe 'while (m#/(\*?)(.*?)\1/#sg) { print $2 }' input.txt

-0777 开关和 $/= undef 将导致文件读取,这意味着所有文件都被读入标量。我还添加了 /s 修饰符以允许通配符 . 匹配换行符。

正则表达式的说明:m#/(\*?)(.*?)\1/#sg

m#              # a simple m//, but with # as delimiter instead of slash
/(\*?) # slash followed by optional *
(.*?) # shortest possible string of wildcard characters
\1/ # backref to optional *, followed by slash
#sg # s modifier to make . match \n, and g modifier

这里的“神奇之处”在于,仅当在其之前找到一个星号 * 时,反向引用才需要星号。

关于perl - 使用 sed、awk 或 perl 从行中提取特定模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11102846/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com