gpt4 book ai didi

awk -/start/,/end/范围表达式在awk中曾经有用吗?

转载 作者:行者123 更新时间:2023-12-03 14:55:31 25 4
gpt4 key购买 nike

我一直主张您永远不要使用如下范围表达式:

/start/,/end/

在awk中,因为虽然这很简单,但您只希望打印匹配的文本(包括开始和结束行)比替代方法要简短一些*:
/start/{f=1} f{print; if (/end/) f=0}

当您想要对其进行微调以进行其他任何操作时,它需要完全重写,否则将导致重复的代码或其他不良代码。例如如果要使用上面的第二种形式打印不包括范围定界符的匹配文本,则只需对其进行调整即可移动组件:
f{if (/end/) f=0; else print} /start/{f=1}

但是,如果您以 /start/,/end/开头,则需要放弃该方法,转而支持我刚刚发布的内容,否则您必须编写类似以下内容的代码:
/start/,/end/{ if (!/start|end/) print }

即复制不希望的条件。

然后,我看到一个发布的问题,该问题需要标识文件中的LAST end以及解决方案中使用了范围表达式的位置,我认为这似乎有些值(value)(请参阅 https://stackoverflow.com/a/21145009/1745001)。

但是,现在,我回到考虑根本不值得使用范围表达式的问题,并且不使用范围表达式的解决方案在这种情况下也同样适用。

那么-有没有人举一个范围表达式实际上为解决方案添加引人注目的值(value)的例子?

*我曾经使用:
/start/{f=1} f; /end/{f=0}

但是很多次我发现当 f为true并且找到 /end/时,我不得不做些额外的事情(或者换句话说,如果 /end/为true,则只有当找到 f时才做某事),所以现在我只是尝试坚持一点简短但更健壮和可扩展:
/start/{f=1} f{print; if (/end/) f=0}

最佳答案

有趣。我也经常从范围表达式开始,然后再切换到使用变量。

我认为,除了纯范围的情况外,如果您要打印匹配项,但仅在一定范围内时,可能会有用。也因为它是立即显而易见的。例如:

awk '/start/,/end/{if(/ppp/)print}' file

使用此输入:
start
dfgd gd
ppp 1
gfdg
fd gfd
end
ppp 2
ppp 3
start
ppp 4
ppp 5
end
ppp 6
ppp 7
gfdgdgd

将产生:
ppp 1
ppp 4
ppp 5

-
当然可以使用:
awk '/start/{f=1} /ppp/ && f; /end/{f=0}' file

但是它更长,可读性更差。

关于awk -/start/,/end/范围表达式在awk中曾经有用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23934486/

25 4 0