Cut
如何根據有空格的分隔符剪切字元串
variable_list=" any:any:-a -b -c any one:one:-c -b -f -m mul mul:one:-c -b -f -m mul " for f in `echo $variable_list` do c1=`echo $f | cut -d':' -f1`; c2=`echo $f | cut -d':' -f2`; c3=`echo $f | cut -d':' -f3-`; echo "c1==>$c1 and c2==>$c2 and c3==>$c3"; #exit 0; ###I made mistake here done;
預期輸出:
c1==>any and c2==>any and c3==>-a -b -c any c1==>one and c2==>one and c3==>-c -b -f -m mul c1==>mul and c2==>one and c3==>-c -b -f -m mul
編輯1:
我意識到我在使用腳本時很愚蠢,並且在第一次迭代時我
exit 0
只測試第一行,因為我有很多真實的。它按照它必須的方式工作。我可以通過維護
variable_list
而不修改輸入的格式/方式來實現上述輸出嗎?(我正在使用 bash)
您的問題與數據中的空格有關。shell 會將字元串拆分為所有空格上的單詞,並且
for
循環將遍歷這些單詞。(對於不替換
variable_list
為數組的解決方案,請參閱此答案的最後。)相反,使用適當的數組:
variable_list=( "any:any:-a -b -c any" "one:one:-c -b -f -m mul" "mul:one:-c -b -f -m mul" ) for var in "${variable_list[@]}"; do c1=$( cut -d':' -f1 <<<"$var" ) c2=$( cut -d':' -f2 <<<"$var" ) c3=$( cut -d':' -f3- <<<"$var" ) printf 'c1==>%s and c2==>%s and c3==>%s\n' "$c1" "$c2" "$c3" done
使用數組可確保您可以將每個單獨的變數集作為其自己的數組條目來訪問,而無需依賴換行符或其他字元分隔它們。
該程式碼還使用“here-strings”
bash
將字元串發送到cut
(而不是echo
管道)。或者,更有效地,
variable_list=( "any:any:-a -b -c any" "one:one:-c -b -f -m mul" "mul:one:-c -b -f -m mul" ) for var in "${variable_list[@]}"; do IFS=':' read -r c1 c2 c3 <<<"$var" printf 'c1==>%s and c2==>%s and c3==>%s\n' "$c1" "$c2" "$c3" done
設置
IFS
為冒號read
會read
在冒號(而不是空格、製表符和換行符)上拆分輸入。請注意,上面的所有引用都很重要。如果沒有雙引號,shell 將對 的值和三個變數執行分詞和文件名
variable_list
通var
配c
。有關的:
如果您所追求的只是那個特定的輸出,那麼您可能會作弊:
variable_list=( "any:any:-a -b -c any" "one:one:-c -b -f -m mul" "mul:one:-c -b -f -m mul" ) ( IFS=':'; set -f; printf 'c1==>%s and c2==>%s and c3==>%s\n' ${variable_list[@]} )
這會
printf
在子 shell 中執行,因此設置IFS
和-f
(noglob
) shell 選項不會影響腳本的其餘部分。在此處設置IFS
為冒號將使 shell 將不帶引號variable_list
的數組擴展為三組三個參數printf
。printf
將根據其格式字元串列印前三個,然後為下一組三個參數重用該格式,直到所有參數都已處理。如果其中有任何文件名萬用字元,則可以
set -f
防止未引用的擴展觸發文件名萬用字元。variable_list
使用換行符分隔的字元串:
variable_list=" any:any:-a -b -c any one:one:-c -b -f -m mul mul:one:-c -b -f -m mul" while IFS= read -r var; do IFS=':' read -r c1 c2 c3 <<<"$var" printf 'c1==>%s and c2==>%s and c3==>%s\n' "$c1" "$c2" "$c3" done <<<"$variable_list"
這從字元串中讀取數據,就好像它來自文件一樣。
有關的: