1

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

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

meshtalfile是一个(大)输入文件,其中包含一些标题行和许多数据行块,每个数据行都由一个开始行标记,该行在上面的 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。尝试使用 number34而不是返回9而不是4354479. 似乎 sed 只返回数字的最后一位 - 这肯定违反了贪婪匹配的原则?奇怪的是,当我将(左括号移动到包含几个字符时.*,它会将整行返回并包括它之前返回的单个字符。它肯定不能在一种情况下贪婪而在另一种情况下反贪吗?希望我刚刚用语法做了一些愚蠢的事情......

4

3 回答 3

2

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

一个解决方案可能是:

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

现在,在和\s之间明确地强制在您要匹配的数字之前有一个空格。.*[0-9][0-9]*

希望这会有所帮助=)

于 2012-09-28T11:24:45.783 回答
1

$tempvar 中的值应该是多行还是单行?因为如果它是单行,“.*$”应该匹配到行尾,也意味着所有其他值,对吧?

于 2012-09-28T11:24:52.397 回答
1

不需要sed,这是一种使用方法GNU grep

echo "$tempvar" | grep -oP "[0-9]+(?=:\sMesh\sTally\sNumber\s${meshnum1}\b)"
于 2012-09-28T11:51:32.647 回答