使用sed以平方根替换数字

时间:2015-07-31 10:09:46

标签: regex bash awk sed

当学习使用像grep awk和sed这样的正则表达式匹配工具时,我想出了一个问题,即我们是否可以匹配文本,例如所有非负数,并用它们的平方根替换它们(或者更通用的值)任何功能返回)? 我的意思是这样的:

sed 's/([^-][1-9][0-9]*) /sqrt(\1)/g' text.txt

但显然这个不行。那么可以这样做吗?

2 个答案:

答案 0 :(得分:2)

sed无法评估数字的平方根。您可以改为使用这样的awk:

awk '{ for(i = 1; i <= NF; ++i) if ($i ~ /[^-][1-9][0-9]*/) $i = sqrt($i) }1' file

循环遍历所有字段,如果它与模式匹配,则用平方根替换该值。最后的1 true ,以便打印每一行。

答案 1 :(得分:1)

我不知道用sed做这个方法,但如果你愿意使用perl:

perl -pe 's/(?<![\-\d])(\d+)/sqrt($1)/eg' text.txt

我改变了正则表达式,因为你的(([^-][1-9][0-9]*)

  • 包括匹配中的前一个字符,例如2;345;将匹配;345
  • 需要前面的字符,例如2;345;2
  • 不匹配
  • 可以匹配一个数字,例如-12将匹配121匹配的[^-]2匹配的[1-9]