【问题标题】:shell script taking last empty line of a file alsoshell脚本也取文件的最后一个空行
【发布时间】:2013-06-07 09:15:04
【问题描述】:

我有一个脚本:

#! /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}"

该脚本将从文件IMEI.txt 的每一行中获取14位数字,构建如下命令:

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; <-- *)

*) 对于输入行的最后一个空行(因为我在保存输入文件时按了最后一个输入)它正在输出文件中构建一个我不想要的命令。有什么快速、简短和聪明的方法来解决这个问题?

【问题讨论】:

    标签: linux shell unix scripting ksh


    【解决方案1】:
    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
    

    【讨论】:

    • 非常感谢。第一种方法对我来说很好。不知何故,第二种方法对我不起作用。
    • 哦,麻烦了——我在循环之后留下了&lt; "$FILE_NAME",它覆盖了sed 命令的输入。我已经删除了它;然后该命令应该可以工作了。
    • 感谢您尝试@HankLangeveld,但修改后的代码对我来说是不可读的。您使用什么尺寸的屏幕,您会在显示的代码上获得水平滚动条?我的屏幕上没有滚动条(1920x1400 左右)。
    • 两种方式都应用,我可以看到它没有为最后一行添加命令,即它现在跳过最后一行:
    • @JonathanLeffler 我的屏幕大小无关紧要,因为浏览器在左侧和右侧显示了足够的空间。您使用哪种浏览器?我一直在寻找妥协;我不想更改代码的实际工作并将其全部保留在文本框架内。
    猜你喜欢
    • 2012-10-06
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 1970-01-01
    • 2019-02-10
    • 2013-11-09
    • 1970-01-01
    相关资源
    最近更新 更多