我的第二個問題,把「_」我有這樣的行巴什 - 變線和數字前後Bash-
New York 17 Hello 1246873 548
,我希望得到這樣的:
New York_17_Hello_1246873_548_
我也可以有
Hello_17_New York_123456_54_
*不關心,如果最終下劃線的存在與否,但是 ,我們必須使用數組來解決這個問題,所以我想削減它,並將其存儲到一個數組,但被困在中間 任何解決方案:)
我的第二個問題,把「_」我有這樣的行巴什 - 變線和數字前後Bash-
New York 17 Hello 1246873 548
,我希望得到這樣的:
New York_17_Hello_1246873_548_
我也可以有
Hello_17_New York_123456_54_
*不關心,如果最終下劃線的存在與否,但是 ,我們必須使用數組來解決這個問題,所以我想削減它,並將其存儲到一個數組,但被困在中間 任何解決方案:)
你可以使用這個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_
的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]$/ ? "_" : "";
'
沒有最後的下劃線就會容易得多。
在純bash中,沒有外部的工具(sed
,awk
等)需要:
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_
一個簡單的天然的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理解爲變量名稱的一部分。