Cut

如何根據有空格的分隔符剪切字元串

  • July 12, 2018
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為冒號readread在冒號(而不是空格、製表符和換行符)上拆分輸入。

請注意,上面的所有引用都很重要。如果沒有雙引號,shell 將對 的值和三個變數執行分詞和文件名variable_listvarc

有關的:


如果您所追求的只是那個特定的輸出,那麼您可能會作弊:

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的數組擴展為三組三個參數printfprintf將根據其格式字元串列印前三個,然後為下一組三個參數重用該格式,直到所有參數都已處理。

如果其中有任何文件名萬用字元,則可以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"

這從字元串中讀取數據,就好像它來自文件一樣。

有關的:

引用自:https://unix.stackexchange.com/questions/454912