区切り文字なしで文字列のさまざまな部分を解析します。

区切り文字なしで文字列のさまざまな部分を解析します。
115:wc -l:find . -iname "*test*":find /tmp/ -iname "*test*"

上記の文字列を解析したいと思います。

私の場合、文字列は4つの列(:各コマンドの区切り文字を含む)で構成されていますが、長くすることもできます。で始まり、...常に区切り文字なしで115続く初期番号を含むすべてのコマンドを「プール」したいと思います。wc -l, -iname "*test*"find /tmp/ -iname "*test*":

私の変数は$var次の値を取得する必要があります。

var= 115 , var= wc-l , var= find . -iname "*test*" , var= find /tmp/ -iname "*test*"

私のコード:

while read line;
 do
 while [[ $var -ne '0' ]];
   do
    var=$( echo $line | cut -d ':' -f$i )
    i=$( expr $i + 1 )
    echo $var
   done
done <$1

ファイルから行を読み取り、列を空の列に切り捨てるときは、2番目の行を使用します。明らかに何か間違っているようです。エコーが何も印刷しないからです。

ベストアンサー1

私の考えにうまくいくと思うように動作するように変更されたスクリプトは次のとおりです。

i=1     
while read line;                        
  do     
  while :; do 
    var=$( echo $line | cut -d ':' -f$i )                                   
    i=$( expr $i + 1 ) 
    [[ "$var" != "" ]] || break
    echo $var
  done     
done <$1

いくつかの注意:

  • i初期化されていない
  • var初期化もないので、内部ループは一度も実行されません。
  • 何をテストするのかわかりませんが、空の文字列と比較する方が良いと[[ $var -ne '0' ]]思います。$var
  • したがって、空のフィールド(たとえば、2つの連続コロン)がある場合、スクリプトはそこで終了します。

同じことを行うより安定した方法は次のとおりです。

while read line; do
  num_fields=$(echo $line|awk -F':' '{print NF}')
  for (( i=1; i <= num_fields; i++ )); do
    var=$( echo $line | cut -d ':' -f$i )
    echo $var
  done
done <$1

おすすめ記事