2013-06-11 26 views
0

我有一個腳本:shell腳本以文件的最後一個空行也

#! /usr/bin/ksh 

TODAY=$(date +%Y%m%d) 
list=$1 
FILE_NAME="IMEI.txt" 
OUTFILE="${list}_list.out" 

########################################## 
if [ -z ${list} ] 
then 
    echo "Use the syntax ./add_imei.sh <list number>" 
    exit 0 
fi 

while read LINE 
do 
    IMEI=`echo $LINE | 
     sed 's/ //g' | sed -e 's/[^ -~]//g'` 
    END_SERIAL=`echo $IMEI | 
     cut -c9- | sed 's/ //g' | 
       sed -e 's/[^ -~]//g'` 
    echo \ 
     "CRE:EQU,${IMEI}0,${END_SERIAL},${list},,${TODAY};" \ 
      >> ${OUTFILE}i 
done < "${FILE_NAME}" 

該腳本將14位數字號碼從文件IMEI.txt的每一行,建這樣的命令:

CRE:EQU,777777777777770,777777,0,,20130611; 

並將其保存在單獨的輸出文件中。非常簡單的工作。一切工作正常,但是當我看到輸出文件我看到這一點:

CRE:EQU,444444444444440,444444,0,,20130611; 
CRE:EQU,555555555555550,555555,0,,20130611; 
CRE:EQU,666666666666660,666666,0,,20130611; 
CRE:EQU,777777777777770,777777,0,,20130611; 
CRE:EQU,0,,0,,20130611; <-- *) 

*)的輸入線也是最後一個空行(爲我打了過去,同時節省輸入文件輸入),它是在輸出文件中建立一個我不想要的命令。任何快速,簡短和聰明的方法來解決這個問題?

回答

4
while read LINE 
do 
    [ -z "$LINE" ] && continue 
    IMEI=$(echo $LINE | sed 's/ //g' | sed -e 's/[^ -~]//g') 
    END_SERIAL=$(echo $IMEI | cut -c9- | sed 's/ //g' | sed -e 's/[^ -~]//g') 
    echo "CRE:EQU,${IMEI}0,${END_SERIAL},${list},,${TODAY};" >> ${OUTFILE}i 
done < "${FILE_NAME}" 

如果該行爲空,則繼續進行下一次循環迭代。

還是有sed餵養文件循環之前刪除空行(只包含空格和製表符):

sed '/^[  ]*$/d' "$FILE_NAME" | 
while read LINE 
do 
    IMEI=$(echo $LINE | sed 's/ //g' | sed -e 's/[^ -~]//g') 
    END_SERIAL=$(echo $IMEI | cut -c9- | sed 's/ //g' | sed -e 's/[^ -~]//g') 
    echo "CRE:EQU,${IMEI}0,${END_SERIAL},${list},,${TODAY};" >> ${OUTFILE}i 
done 
+0

非常感謝。第一種方式對我來說工作得很好。不知怎的,第二種方式不適合我。 –

+0

哦,麻煩 - 我已經在循環後面留下了<<$ FILE_NAME「',這會覆蓋來自'sed'命令的輸入。我刪除了那個;該命令應該可以工作。 –

+0

感謝您試用@HankLangeveld,但修改後的代碼對我來說是無法讀取的。你使用的是什麼尺寸的屏幕,你得到的水平滾動條顯示的代碼?它的屏幕上沒有滾動條(1920x1400或左右)。 –

相關問題