sed中的awk语句

sed中的awk语句,awk,sed,perl,Awk,Sed,Perl,我多次出现该模式: )0.[0-9][0-9][0-9]: 其中[0-9]是各种文本上下文中的任意数字,但模式与此正则表达式一样唯一。我需要把小数转换成整数(百分比值从0到99) 一个小例子是子字符串 =1:0.00055)0.944:0.02762)0.760:0 =1:0.00055)94:0.02762)76:0 我正在做的是: cat file | sed -e "s/)\([0-9].[0-9][0-9][0-9]\):/)`echo "\1"|awk '{ r=int(100*$

我多次出现该模式:

)0.[0-9][0-9][0-9]:
其中[0-9]是各种文本上下文中的任意数字,但模式与此正则表达式一样唯一。我需要把小数转换成整数(百分比值从0到99)


一个小例子是子字符串

=1:0.00055)0.944:0.02762)0.760:0

=1:0.00055)94:0.02762)76:0

我正在做的是:

cat file | sed  -e "s/)\([0-9].[0-9][0-9][0-9]\):/)`echo "\1"|awk '{ r=int(100*$0); if((r>=0)&&(r<=100)){ print r; } else { print "error"; exit(-1); } }'`:/g"
cat文件| sed-e“s/)\([0-9].[0-9][0-9][0-9]\):/)`echo“\1”| awk'{r=int(100*$0);如果((r>=0)和&(r检查此一行命令:

perl -pe 's/\)(\d+\.\d+):/sprintf ")%d:", $1 * 100/ge' file
之前:

=1:0.00055)0.944:0.02762)0.760:0
之后:

=1:0.00055)94:0.02762)76:0
如果需要在编辑模式下替换为real,请添加
-i
开关:

perl -i -pe '...'

既然你问的是“故障在哪里”,而不是“如何解决问题”:

首先执行回引管道
echo…| awk…
,生成单个
0
,然后将其作为传递给
sed
s///
命令的一部分,从而在模式匹配的任何地方进行替换。PS:使用更新的(后里根时代)和更灵活的符号进行命令替换
$(…)
在除csh系列之外的所有shell中,都首选反引号,尤其是在堆栈中,反引号对于标记是特殊的,并且很难在文本中显示

如果您想实际解决您没有清楚或完整描述的问题,请向更好的方向提出一些建议:

标准sed无法执行命令来生成替换文本;GNU sed可以使用flag
e
来生成替换文本,但您需要将整个patternspace作为命令,并将其他任何内容放到holdspace中,这是一件乏味的事情。perl可以在替换中计算表达式,包括算术;awk(甚至是gawk)无法直接执行此操作,但您可以通过将匹配和替换/重建作为单独的步骤来获得相同的效果,具体取决于您想要执行的操作的未指定和不清楚的详细信息;如果希望保持行的其余部分不变,请执行以下操作:

 awk 'match($0,/)0[.][0-9][0-9][0-9]:/){ print substr($0,1,RSTART) (substr($0,RSTART+1,RLENGTH-2)*100) substr($0,RSTART+RLENGTH-1) }'
但是,如果你对截断感到满意,你实际上不需要在这里使用算术。只需丢弃前导的0和最后一个数字,并将两个数字保持在两者之间:

 sed 's/)0[.]\([0-9][0-9]\)[0-9]:/)0.\1:/g'
注意:regexp中的
,除非转义或charclass中的字符(如我所做的)匹配任何字符,而不仅仅是句点,这可能是一个问题,也可能不是问题,因为您没有给出其余的输入


和PS:进程退出状态的负数不起作用(IIRC计划9除外)。对错误使用较小的(通常<128)正状态值;最常见的是只使用1。

预期输出是什么?例如,如果
)[0-9]。[0-9][0-9][0-9]:
=
)0.123:
那么输出将是
)12:
@Gilles Quenot…嗯…下面检查一下?刷新页面并检查我的响应或单击鼠标右键…但是我需要在一个复杂的字符串中找到并替换此模式,其中该模式被其他各种数字包围。这就是为什么我们试图从sed中导入awk。您的解决方案很聪明,但它是正确的不会在一个字符串中找到和替换..提前感谢您的进一步想法!)因此最好添加真实的示例输入和预期的输出。您的尝试并不清楚一个小示例子字符串将是
=1:0.00055)0.944:0.02762)0.760:0
,变成
=1:0.00055)94:0.02762)76:0
,感谢您使用此重要信息编辑您的帖子谢谢你花时间和解释。我想原因现在越来越清楚了。谢谢你的建议,非常有用。