2015-10-25 181 views
1

所以我的問題是如何計算Linux中給定字符串中每個單詞的單個字符?用Sed計算字符串中每個單詞的字符

這裏是什麼,我想實現一個例證:

$ echo "But a time I spent wandering in bloomy night;" | ... 

應該給我:

314159265 

3字中的人物 '但是',1爲 'A' 和等等..

+0

+1使用'sed'而非' wc':我知道這是一個荒謬的用例,因爲當我們有'wc'時爲什麼要麻煩,但我認爲找到像'sed'這樣的不尋常的東西很有趣,即使'sed'不能實際上做什麼是在這裏問。 –

回答

1

不知道你爲什麼指定sed;計算事物並不是它的特長。這是很容易與awk,雖然:

$ echo "But a time I spent wandering in bloomy night" | 
    awk '{for (i=1;i<=NF;++i) printf "%d", length($i); print ""}' 
314159265 

注意,在您的版本分號將被計算在內,這意味着它會錯誤地給最後一個數字爲6,而不是5.如果你想只計算字母,你可以引入sed回到組合:

$ echo "But a time I spent wandering in bloomy night;" | 
    sed 's/[^a-zA-Z ]//g' | 
    awk '{for (i=1;i<=NF;++i) printf "%d", length($i); print ""}' 

或者,你可以用shell內置做到這一切。假設你的shell是bash,這將工作:

echo "But a time I spent wandering in bloomy night;" | { 
read -a pi 
for d in "${pi[@]}"; do 
    d=${d//[^A-Za-z]} 
    echo -n ${#d} 
done 
echo; } 

展望從AWK的其他方式,這是一個班輪在Perl或Ruby:

$ echo "But a time I spent wandering in bloomy night;" | 
    perl -lne 'print map { s/[^A-Za-z]//g; length } split' 

$ echo "But a time I spent wandering in bloomy night;" | 
    ruby -ne 'puts $_.split.map{|w| w.gsub(/[^A-Za-z]/, "").length }.join' 
+0

是的,我希望它只能計算字母和像字母以外的刪除符號 – Karatawi

+0

好的,謝謝很多人! – Karatawi

+1

但我仍然想知道你是否可以用sed做到這一點,我知道awk是正確的命令,但我們還沒有真正看到它 – Karatawi

相關問題