2010-09-26 67 views
2

此替換串是碼與空間

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。您能否請告知我如何從字符串count="0"中分離0?

+0

您好,XML文件具有線 '<表達式1:expr2.expr3計數= 「0」 expr4 = 「YYYY-MM-ddT23:55:00.041Z」 expr5 = 「0.0」 expr6 = 「0.0」 />'。因此,我們的輸出應該是來自FOR循環中不同文件的計數的整數值的總和,即0 + 2 + ... 因此,我在tmp_20100923 *中爲f做了什麼 。xml do str1 ='more「$ f」| grep count ='// grep具有模式的行'count =' i ='echo $ str1 | awk -F「。」 '{print($ 2)}''// output is'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; //現在我們的目標是從 以上得到0 – ErAB 2010-09-26 15:03:28

+0

請參閱我編輯的答案 – 2010-09-26 17:47:36

回答

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 
+0

呀,任何時候你有一個很長的grep,sed和awk序列,它幾乎總是更好,只需用一個簡短的awk程序來替換它。 – 2010-09-26 18:17:42

+0

謝謝,它真的很有用:-) – ErAB 2010-10-05 02:32:21

0

你想sed的名字是附加$ J

相反,你可以

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

這也是正確的,因爲sed的第三個參數是文件。在手冊頁'sed [OPTION] ... {script-only-if-no-other-script} [input-文件] ...' – 2010-09-26 10:08:34

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) 
1

$j刪除所有非數字:

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

您可以使用此sed正則表達式:

 
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是放置另一個程序(awk)的輸出的shell變量。

此外,「>」重定向將東西放在文件中。你寫了「> $ k」,然後「echo $ k」,就好像> $ k在$ k變量中寫入了sed的輸出。

如果你想保留在$ķ變量寫,而不是sed的輸出:

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