2015-05-04 28 views
2

如何遍歷一個字符串數組,並刪除它們的部分值? (BASH)遍歷字符串數組,並刪除它們在Bash中的部分值?

我有一個數組填充了保存爲字符串的網站列表,我想要抓住它們位於'.com.au'左側的部分並將它們保存到新數組中。字符串中還有一些項目不以'.com.au'結尾,我想完全忽略它們。

爲了使它有點更容易閱讀,我已經刪除的大部分代碼,只留在我認爲將是相關的問題:

#!/bin/bash 
full_array(*); declare -p full_array 
edited_array=() 

for x in ${full_array[@]}; 
    #If x ends with '.com.au' 
     #Remove '.com.au' from x 
     #Save output to edited_array 
    #Else 
     #Skip item 
done 

我將不得不使用正則表達式做這個?如果是這樣,有沒有人知道在線的任何好的教程,值得一試?

+0

是你有使用bash做一個特別的原因嗎?你有沒有試過sed或awk? –

+0

我被告知用bash寫它,所以我試圖堅持。 – Thorium

+1

你想使用''$ {full_array [@]}「(引號很重要)來確保你處理文件/條目/等。正確地使用空格和shell元字符。你不需要regex(儘管你可以使用它們),你也可以使用[Shell Parameter Expansion](http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion)嘗試去除後綴並將剝離值與原始值進行比較。 –

回答

2

刪除該域,並追加到數組這應該工作:

for x in ${full_array[@]};do 
[[ $x == *.com.au ]] && edited_array+=("${x%.com.au}") 
done 
+1

謝謝,此工作完美:) – Thorium

1
if [[ $x == *.com.au ]]; then 
    edited_array+=("${x%.com.au}") 
fi 

在bash的雙括號內,==運算符是一個模式匹配運算符。然後,只需使用shell參數擴展與+=

+0

我編輯了我的代碼,將其包含在內(實際上只是將其複製/粘貼到for循環中),但是現在我得到一個意外的EOF錯誤,告訴我它正在尋找一個結束報價。你知道可能會發生什麼嗎?我在任何地方都看不到任何公開報價? – Thorium

+0

我做了一個修正,但它仍然不可見。你應該用'%'代替'#'。 – naitoon

+0

我之前的評論是關於答案的。現在關於第一條評論和缺少的引號:在問題片段的「for x in ...」行後面有一個「do」關鍵字缺失。在終端輸入'help for',你會看到。 – naitoon