linux - shell脚本也获取文件的最后一个空行

标签 linux shell unix scripting ksh

我有一个脚本:

#! /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; <-- *)

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

最佳答案

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

关于linux - shell脚本也获取文件的最后一个空行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17045509/

相关文章:

linux - 为什么 (ps -f) 不创建子 shell 而是创建一个单独的进程?

linux - 如何在内核模块 Makefile 中提供包含目录路径

linux - 什么是 moby 运行时?

shell - bash echo 带有转义反引号和 $

c - 从终端读取的后台作业

linux - 修改 tar 存档中嵌套的文件

LInux shell : conditional conversion of character encoding, 多个文本文件

linux - 使用主机系统的代理构建 Docker

bash - `c&&!--c;`与 `awk`一起使用时的作用

database - 在没有 UTL_FILE 的情况下从 SQLplus 检查 UNIX 中是否存在文件