gpt4 book ai didi

linux - sed 正则表达式不贪心?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:32 26 4
gpt4 key购买 nike

在 bash 中我有一个字符串变量 tempvar,它是这样创建的:

tempvar=`grep -n 'Mesh Tally' ${meshtalfile}`

meshtalfile 是一个(大)输入文件,其中包含一些标题行和许多数据行 block ,每行都标有在上面的 grep 中搜索的起始行。

在本例中,变量 tempvar 包含以下字符串:

5: Mesh Tally Number 4 977236: Mesh Tally Number 14 1954467: Mesh Tally Number 24 4354479: Mesh Tally Number 34

我现在希望提取与特定网格计数相关的行号 - 因此我定义了一个变量 meshnum1 等于 24,并运行以下 sed 命令:

echo ${tempvar} | sed -r "s/^.*([0-9][0-9]*):\sMesh\sTally\sNumber\s${meshnum1}.*$/\1/"

这就是问题所在。我期望输出 1954467,但我得到的是 7。尝试使用数字 34 而不是返回 9 而不是 4354479。似乎 sed 只返回数字的最后一位 - 这肯定违反了贪婪匹配的原则?奇怪的是,当我移动左括号 ( 留下几个字符以包含 .* 时,它返回整行直到并包括它之前返回的单个字符.当然它不能在一种情况下贪婪而在另一种情况下反贪婪吗?希望我刚刚用语法做了一些愚蠢的事情......

最佳答案

问题是 .* 也很贪心,这意味着它也会得到所有数字。由于您强制它在 [0-9][0-9]* 部分中至少获得一位数字,因此它之前的 .* 将足够贪婪地离开后面的表达式只有一个数字。

解决方案可能是:

echo ${tempvar} | sed -r "s/^.*\s([0-9][0-9]*):\sMesh\sTally\sNumber\s${meshnum1}.*$/\1/"

现在 .*[0-9][0-9]* 之间的 \s 明确强制那里在要匹配的数字前加一个空格。

希望这有帮助 =)

关于linux - sed 正则表达式不贪心?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12638753/

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