Bash 用空格替换字符串

Bash 用空格替换字符串,bash,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过滤器从上述输出中获

这是密码

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”?

您正在尝试使用名为$j的文件

相反,你可以

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

这应该会在引号之间出现障碍

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)

$j
中删除所有非数字:

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

您可以使用此sed regexp:

sed 's/count="\(.*\)"/\1/' 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)}`//输出为`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' j=`echo$i|awk-F”“{print($2)}`//输出为`count=“0”` echo$j | sed's/count=//g' 或者更好:

echo $i | awk -F " " '{print($2)}' | 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'` j=`echo$i|awk-F”“{print($2)}`//输出为`count=“0”` k=`echo$j | sed's/count=//g'`
您可以让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

这也是正确的,因为sed的第三个参数是文件…Hi,xml文件有一行
。因此,我们的输出应该是for循环中不同文件的count的整数值之和,即0+2+…因此,我在tmp_20100923*中为f做了什么。xml do str1=
more“$f”| grep count=
/grep有模式的行
count=
i=
echo$str1 | awk-f”。{print($2)}“
//输出是
expr3 count=“0”expr4=“yyyy-mm-ddT23:55:00
j=
echo$i | awk-F”“{print($2)}”
//输出是
count=“0”
sed's/count=/g'$j>$k;echo$k;//现在的目标是从上面的doneyah获得0,任何时候你有一个长序列的grep、sed和awk,用一个短的awk程序替换它几乎总是更好的。谢谢,它真的很有用:-)