gawk中gensub代换的算法

gawk中gensub代换的算法,awk,gawk,Awk,Gawk,我想知道是否可能做到以下几点: echo -e "0@1 1@1 0@0\n0@0 1@1 0@1" | awk '{print gensub(/([01])@([01])/, "\\1" + "\\2", "g")}' 它不能按现在的方式工作;这是因为“+”的求值发生在“\1”和“\2”的替换之前吗 作为输出,我希望1是\1和\2的算术结果,因此对于\1=0和\2=1,输出应该是1 此外,根据下面的回答,我不想寻找如何在“中添加1和0”的解决方案1@0"; 这只是一个例子,我只是想知道是否有

我想知道是否可能做到以下几点:

echo -e "0@1 1@1 0@0\n0@0 1@1 0@1" | awk '{print gensub(/([01])@([01])/, "\\1" + "\\2", "g")}'
它不能按现在的方式工作;这是因为“+”的求值发生在“\1”和“\2”的替换之前吗

作为输出,我希望1是\1和\2的算术结果,因此对于\1=0和\2=1,输出应该是1

此外,根据下面的回答,我不想寻找如何在“中添加1和0”的解决方案1@0"; 这只是一个例子,我只是想知道是否有可能对\1和\2进行算术运算,因为这是可行的:
gensub(/blah blah/,0+1,“g”)
给出了
1
您不能使用
gensub()
进行此操作,因为它将捕获的组作为文本字符串返回作为其结果

对于这样一个简单的需求,请使用
@
作为字段分隔符,并按如下方式进行算术计算:

echo "0@1" | awk -F@ '{print ($1 + $2)}'
或者,如果您担心输入字符串中的字符串值,请使用
int()
casting强制进行数字转换,或者只向每个操作数添加
+0
,即使用
(int($1)+int($2))
($1+0)+($2+0))

根据下面答案中更新的问题/注释,执行常量数值运算不是
gensub()
的目的,它应该执行基于regexp的模式搜索和替换。大多数情况下,替换部分涉及处理搜索字符串中捕获的组,并对其应用一些修改

不能对此使用
gensub()
,因为它将捕获的组作为文本字符串返回作为结果

对于这样一个简单的需求,请使用
@
作为字段分隔符,并按如下方式进行算术计算:

echo "0@1" | awk -F@ '{print ($1 + $2)}'
或者,如果您担心输入字符串中的字符串值,请使用
int()
casting强制进行数字转换,或者只向每个操作数添加
+0
,即使用
(int($1)+int($2))
($1+0)+($2+0))


根据下面答案中更新的问题/注释,执行常量数值运算不是
gensub()
的目的,它应该执行基于regexp的模式搜索和替换。大多数情况下,替换部分涉及处理搜索字符串中捕获的组,并对其应用一些修改

我想我了解您想要什么,您可以在Perl中使用
e
修饰符对替换进行求值。下面是一个例子:

echo "7@302" | perl -nle 's/(\d+)@(\d+)/$1+$2/e && print'
309
或者,稍微有趣一点:

echo "The 200@109 cats sat on the 7@302 mats" | perl -nle 's/(\d+)@(\d+)/$1+$2/ge && print'
The 309 cats sat on the 309 mats

我想我了解您想要什么,您可以在Perl中对替换使用
e
修饰符,这意味着它对替换进行求值。下面是一个例子:

echo "7@302" | perl -nle 's/(\d+)@(\d+)/$1+$2/e && print'
309
或者,稍微有趣一点:

echo "The 200@109 cats sat on the 7@302 mats" | perl -nle 's/(\d+)@(\d+)/$1+$2/ge && print'
The 309 cats sat on the 309 mats
当您编写
foo(bar())
时,您会发现
bar()
首先执行,无论它是函数还是任何表达式,因此
gensub(…,“\\1”+“\\2”,…)
使用添加两个字符串的结果调用
gensub()
,即
gensub(…,0,…)

这在语义上与您编写的代码不完全相同,但是要实现您想要的功能,可以使用第三个参数
match()

上面使用GNU awk作为第三个参数来
match()
,但是您已经在
gensub()中使用了它。如果不清楚如何在真实数据上使用它,那么发布一个包含真实数据示例的后续问题。

当您编写
foo(bar())
时,您会发现
bar()
首先执行,无论它是函数还是任何表达式,所以
gensub(…,“\\1”+“\\2”,…)
调用
gensub()
使用添加两个字符串的结果,即
0
,即
gensub(…,0,…)

这在语义上与您编写的代码不完全相同,但是要实现您想要的功能,可以使用第三个参数
match()


上面使用GNU awk作为第三个参数来
match()
,但是您已经在
gensub()中使用了它。如果不清楚如何在真实数据上使用它,请发布一个后续问题,其中包括真实数据的示例。

您可以使用sed w/bc进行计算,就像Mark used perl:

echo”7@302“|sed-E的/([0-9]+)@([0-9]+)/echo”\1++\2“|bc/E”

您可以使用sed w/bc进行计算,就像Mark使用perl的方式:

echo”7@302“| sed-E的/([0-9]+)@([0-9]+)/echo”\1++\2“| bc/E”

最好建议预期的输出。是字符串形式的
0+1
还是数字形式的0+1=1…?如果您能向我们展示您正在寻找的输出,那就太好了,请在您的帖子中的代码标签中添加预期输出。最好建议预期输出是什么。它是字符串形式的
0+1
,还是数字形式的
0+1=1…?如果您能向我们展示您正在寻找的输出,那就太好了,请在您的帖子中的代码标签中添加预期的输出。我不知道任何
perl
,但我认为
perl
可以做任何事情,
awk
也可以做吗?没有?我可能会因此而被击倒,但我认为从最低到最高的能力顺序是:
sed
awk
Perl
@A。暴雪标记是正确的
awk
是一种用于处理所有文本的语言
perl
还可以操作文本,但它还可以做您使用其他工具/语言所做的事情,例如,像使用shell一样操作文件和进程。结果是,awk是一种非常小、简单的工具/语言,它只做一件事,而且做得很好,而perl则完全不同(参见:-)。我不知道任何
perl
,但我认为任何
perl
都可以做,
awk
也可以做吗?不?我可能会因此而被击倒在火焰中,但我的感知能力顺序是从l开始的