如何使用shell脚本从文件中读取单词

时间:2016-03-04 09:40:18

标签: shell

我有一个文件/ws/$1-rcd/temp.txt,其中只有一行如下

198|/vob/ccm_tpl/repository/open_source/commons_collections/3_2_2/...

我有一个脚本通过读取文件并使用for循环遍历它来获取值存储库/ open_source / commons_collections和3_2_2

我的代码如下

grep -n "$4" /ws/$1-rcd/raw-vobs-config-spec | cut -d " " -f1,2 | sed -e 's/\:element/|/g' | sed -e 's/ //g' > /ws/$1-rcd/temp.txt
    for i in `cat /ws/$1-rcd/temp.txt`
    do
    line=`echo $i | cut -d"|" -f1`
    path=`echo $i | cut -d"|" -f2`
    whoami
    directory_temp=`echo $path | awk -F "/" '{ print $(NF-2)}'`
    if [ "$directory_temp" == "$4" ]
    then
    OLD_VERSION=`sed -n "${line}p" /ws/$1-rcd/raw-vobs-config-spec | cut -d      " " -f2 | awk -F "/" '{ print $(NF-1)}'`
    total_fields=`sed -n "${line}p" /ws/$1-rcd/raw-vobs-config-spec | cut -d " " -f2 | awk -F "/" '{ print NF }'`
    dir_path=`expr ${total_fields} - 2`

    loc=`sed -n "${line}p" /ws/$1-rcd/raw-vobs-config-spec | cut -d " "        -f2     | cut         -d"/" -f1-"${dir_path}"`

    location=`echo $loc | cut -d"/" -f4,5,6`
    fi
    done

但是当我运行此代码时,它会给我一个错误

  

-bash:第45行:198中的i意外令牌|' -bash: line 45:附近的语法错误| / vob / ccm_tpl / repository / open_source / commons_collections / 3_2_2 /...'

任何人都可以建议我做错了什么

2 个答案:

答案 0 :(得分:0)

如果要遍历文件的每一行,请使用while循环,如下所示

while read -r line ;do
  echo $line
done <file.txt

因此,您的代码可以重写为

grep -n "$4" /ws/$1-rcd/raw-vobs-config-spec | cut -d " " -f1,2 | sed -e 's/\:element/|/g' | sed -e 's/ //g' > /ws/$1-rcd/temp.txt
while read i ;  do
    line=`echo $i | cut -d"|" -f1`
    path=`echo $i | cut -d"|" -f2`
    whoami
    directory_temp=`echo $path | awk -F "/" '{ print $(NF-2)}'`
    if [ "$directory_temp" == "$4" ]
    then
    OLD_VERSION=`sed -n "${line}p" /ws/$1-rcd/raw-vobs-config-spec | cut -d      " " -f2 | awk -F "/" '{ print $(NF-1)}'`
    total_fields=`sed -n "${line}p" /ws/$1-rcd/raw-vobs-config-spec | cut -d " " -f2 | awk -F "/" '{ print NF }'`
    dir_path=`expr ${total_fields} - 2`

    loc=`sed -n "${line}p" /ws/$1-rcd/raw-vobs-config-spec | cut -d " "        -f2     | cut         -d"/" -f1-"${dir_path}"`

    location=`echo $loc | cut -d"/" -f4,5,6`
    fi
done < /ws/$1-rcd/temp.txt

答案 1 :(得分:0)

依靠参数扩展和子字符串删除可能会更好。例如:

#!/bin/sh

a=$(<dat/lline.txt)       ## read file into a
a=${a##*ccm_tpl/}         ## remove from left to ccm_tpl/
num=${a##*collections/}   ## remove from left to collections/
num=${num%%/*}            ## remove from right to /
a=${a%%${num}*}           ## remove from right to $num

输入文件

$ cat dat/lline.txt
198|/vob/ccm_tpl/repository/open_source/commons_collections/3_2_2/..

<强>输出

$ sh getvals.sh

 a   : repository/open_source/commons_collections/
 num : 3_2_2

如果您需要以其他方式修剪,请告诉我,我很乐意进一步提供帮助。