2016-05-19 24 views
1

我的第二個問題,把「_」我有這樣的行巴什 - 變線和數字前後Bash-

New York 17 Hello 1246873 548 

,我希望得到這樣的:

New York_17_Hello_1246873_548_ 

我也可以有

Hello_17_New York_123456_54_ 

*不關心,如果最終下劃線的存在與否,但是 ,我們必須使用數組來解決這個問題,所以我想削減它,並將其存儲到一個數組,但被困在中間 任何解決方案:)

回答

0

你可以使用這個sed的:

p='New York 17 Hello 1246873 548' 
sed -E 's/ *([0-9]+) */_\1_/g; s/_(_[0-9]+)/\1/g' <<< "$p" 

New York_17_Hello_1246873_548_ 
0

的Perl解決方案:

echo 'New York 17 Hello 1246873 548 
Hello 17 New York 123456 54' \ 
    | perl -lnwe ' @f = split /(?<=[0-9]) | (?=[0-9])/; 
        print join("_", @f), $f[-1] =~ /[0-9]$/ ? "_" : ""; 
       ' 

沒有最後的下劃線就會容易得多。

1

在純bash中,沒有外部的工具(sedawk等)需要:

s='New York 17 Hello 1246873 548' 

# replace any space immediately before a digit with an underscore 
while [[ $s =~ (^|[[:space:]])[[:digit:]] ]]; do 
    s=${s//$BASH_REMATCH/_${BASH_REMATCH:1}} 
done 

# replace any space immediately after a digit with an underscore 
while [[ $s =~ [[:digit:]]([[:space:]]|$) ]]; do 
    s=${s//$BASH_REMATCH/${BASH_REMATCH:0:1}_} 
done 

...發出:

New York_17_Hello_12468_73_548_ 
1

一個簡單的天然的bash解決方案是使用參數擴展:

${variable// /_} 

這將取代每次出現的 variable_

例如,

test="New York 17 Hello 1246873 548" 
echo ${test// /_} 

將輸出New_York_17_Hello_1246873_548

但是,您要求基於陣列的解決方案。請注意,這尤其令人費解,因爲bash非常適合處理字符串,但與數組無關。

第一步是將文本分割成一個單詞數組。這可以很容易做到的文字是分隔空間,空間是用於參數默認的分隔符:

testArray=($test) 
echo ${testArray[0]} 

,這裏將輸出New回聲。

現在我們需要加入_。既然你說你不關心尾隨_,你可以只打印陣列後面是_的各個部分:

for part in ${testArray[@]}; do 
    echo -n "${part}_" 
done 

這裏${testArray[@]}爆炸的陣列,其中for可以再循環結束,echo -n輸出沒有使用換行符跟隨它的文本。我們需要將$part變量括入${...},否則下劃線將被bash理解爲變量名稱的一部分。