我試圖從在時尚格式,如文本文件中讀取列(其中你有一個關鍵字列和相關的密鑰值):讀詞/短語與空間
蜜桔12
榴蓮5
蘋果3.5
使用讀取功能,我可以在閱讀欄目,但只有當列基本上每一個字。在上述示例中,我不確定要做什麼,因爲第二項是兩個單詞,但我想將它作爲一個單詞存儲。
我試圖從在時尚格式,如文本文件中讀取列(其中你有一個關鍵字列和相關的密鑰值):讀詞/短語與空間
蜜桔12
榴蓮5
蘋果3.5
使用讀取功能,我可以在閱讀欄目,但只有當列基本上每一個字。在上述示例中,我不確定要做什麼,因爲第二項是兩個單詞,但我想將它作爲一個單詞存儲。
隨着一個正則表達式:
while read -r line; do
[[ $line =~ ^(.*)\ (.*)$ ]] && echo "${BASH_REMATCH[1]}|${BASH_REMATCH[2]}"
done < file
輸出:
tangerine|12 durian fruit|5 apple|3.5
${BASH_REMATCH[1]}
包含第一列和${BASH_REMATCH[2]}
秒柱。
您應該使用除空格以外的其他名稱來區分名稱和計數,如選項卡。然後,你可以使用
while IFS=$'\t' read -r fruit count; do
echo "Fruit: $fruit"
echo "Count: $count"
done < data.txt
如果不能做出改變,你可以閱讀每一行到一個數組中,並重新加入第一組列。不過,這會失去任何特定的空白區域。
while read -a data; do
fruit=${data[*]:0:${#data[@]}-1}
count=${data[@]:${#data[@]}-1}
done < data.txt
無論採用哪種方式,都可以在循環內建立水果名稱和計數的數組。
while ...; do
fruits+=("$fruit")
counts+=("$count")
done << ...
for ((i=0; i<${#fruits[@]}; i++)); do
echo "Fruit #$i: there are ${counts[i]} ${fruits[i]}(s)"
done
很好,謝謝!你能簡單介紹一下你所使用的正則表達式格式嗎?我總體上知道一些正則表達式,但它看起來有點像巨無霸。 – Yuerno
後續問題:是否可以使用循環迭代BASH_REMATCH 1或2中的每個條目?我試圖使用一個for循環,使用一個短語,例如:「for i in」$ {BASH_REMATCH [1]「」,但它只獲取列表中的最後一個條目。 – Yuerno
我的語言技能還不夠。 '\'僅用於轉義空格字符。正則表達式從左到右進行處理。 '*'很貪婪,並盡力捕捉。對於第二個問題:我會省略雙引號。 – Cyrus