用空格替换字符串

时间:2010-09-26 09:32:28

标签: bash

这是代码

for f in tmp_20100923*.xml  
do  
 str1=`more "$f"|grep count=`  
 i=`echo $str1 | awk -F "." '{print($2)}'`  
 j=`echo $i | awk -F " " '{print($2)}'` // output is `count="0"`  
 sed 's/count=//g' $j > $k; echo $k;   
done

我尝试使用sed过滤器从上面的输出中获取值0但没有成功。你能否告诉我如何将0与字符串count="0"分开?

5 个答案:

答案 0 :(得分:1)

$j删除所有非数字:

echo ${j//[^0-9]/}

答案 1 :(得分:1)

你可以让AWK做任何事情:

for f in tmp_20100923*.xml  
do  
    k=$(awk -F '.' '/count=/ {split($2,a," "); print gensub("count=","","",a[2])}')
done

修改

根据您的评论,您不需要拆分小数。你也可以让AWK做总结。所以你不需要shell循环。

awk '/count=/ { sub("count=","",$2); gsub("\042","",$2); sum += $2} END{print sum}' tmp_20100923*.xml

答案 2 :(得分:0)

您正在尝试查找名为$ j的文件

相反,你可以

echo $j | sed 's/count=//g'

答案 3 :(得分:0)

这应该阻止引号之间的所有内容。

sed -re 's/count="([^"]+)"/\1/g'

-r添加--regexp-extended以便能够使用正则表达式来填充内容,而我给你的表达式意味着:

search for count=",
then store ( any character that's not a " ), then
make sure it's followed by a ", then
replace everything with the stuff in the parenthesis (\1 is the first register)

答案 4 :(得分:0)

您可以使用此sed regexp:

sed 's/count="\(.*\)"/\1/'

但是你的脚本有另一个问题:

j=`echo $i | awk -F " " '{print($2)}'` // output is `count="0"`  
sed 's/count=//g' $j > $k; echo $k;   

应该是

j=`echo $i | awk -F " " '{print($2)}'` // output is `count="0"`  
echo $j | sed 's/count=//g'   

或更好:

echo $i | awk -F " " '{print($2)}' | sed 's/count=//g'

'sed'接受文件名作为输入。 $ j是一个shell变量,你可以放置另一个程序的输出(awk)。

此外,“>”重定向将事物放入文件中。你写了“> $ k”然后“echo $ k”,好像> $ k在$ k变量中写了sed的输出。

如果你想将sed的输出保存在$ k变量中,请改为:

j=`echo $i | awk -F " " '{print($2)}'` // output is `count="0"`  
k=`echo $j | sed 's/count=//g'`