在没有分隔符的情况下解析多个部分的字符串

在没有分隔符的情况下解析多个部分的字符串
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

我从文件中读取行,并在将列剪切到空列时使用第二行。显然,有问题,因为 echo 没有打印任何内容。

答案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与空字符串相比更好。
  • 因此,如果有一个空字段(即两个连续的冒号),该脚本将在那里终止

做同样事情的更可靠的方法是:

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

相关内容