6

我有一个使用记事本在 Windows 中创建的文件:

    26453215432460
    23543265235421

    38654365876325


    12354152435243

我有一个脚本,它将读取每一行,并在其他文件中为每一行创建一个如下所示的命令,并且不会考虑空行:

    CRE:EQU,264532154324600,432460,1;

现在,如果我在最后一行数字后按回车键保存我的输入文件12354152435243,那么输出文件包含上面对应于所有数字的命令(包括最后一个12354152435243

    CRE:EQU,264532154324600,432460,1;
    CRE:EQU,235432652354210,235421,1;
    CRE:EQU,386543658763250,876325,1;
    CRE:EQU,123541524352430,435243,1;

但是如果我保存文件,在输入最后一个数字之后没有按回车键12354152435243,那么在脚本执行后,我看不到输出文件有最后一个数字的命令:

    CRE:EQU,264532154324600,432460,1;
    CRE:EQU,235432652354210,235421,1;
    CRE:EQU,386543658763250,876325,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};" >> /apps/ins/list.out
    done < "${FILE_NAME}"

好心的帮助

4

5 回答 5

5

利用

grep . "${FILE_NAME}" | while read LINE

或者

while read LINE
do
....
done < <(grep . "${FILE_NAME}")

grep 对换行不太敏感,您将免费获得空行跳过... :)

老实说,从来没有尝试过windows,对于unix来说,以上都可以...

编辑说明:

制作下一个文件:

echo -n -e 'line\n\nanother\nno line ending here>' >file.txt

该文件包含 4 行(尽管最后“行”不是“正确”行)

line

another
no line ending here>

通常的 shell 例程,作为readwc寻找行尾。所以,

$ wc -l file.txt 
         3 file.txt

当您搜索''(空字符串)时,grep 会返回找到该字符串的每一行,所以

$ grep '' file.txt

印刷

line

another
no line ending here>

当 grep 打印出找到的行时 - 确保最后不存在一个 `\n',所以

$ grep '' file.txt | wc -l

返回

4

因此,对于这些情况,最好使用grepwith -c(count) 而不是wc

$ grep -c '' file.txt
4

现在,.点。点表示任何字符。因此,当您搜索 a 时.,您会得到所有包含至少一个字符的行。因此,它将跳过所有不包含任何字符的行 = 跳过空行。所以,

$ grep . file.txt
line
another
no line ending here>

再次,添加行结束到最后一行(并跳过空行)。请记住,(空格)也是字符,因此当该行仅包含一个空格时,它不是空的。计算非空行

$ grep . file.txt | wc -l
      3

或更快

$ grep -c . file.txt
3
于 2013-06-19T15:41:33.763 回答
0

如果你做 ahelp read它说 for -d delim continue until the first character of DELIM is read, rather than newline

所以 read 会一直持续到它到达 a\n或者你指定-d delim.

因此,您可能需要更改分隔符,或者您可以尝试read -e

于 2013-06-19T15:17:09.327 回答
0

read需要行尾来读取输入。尝试

echo -n $'a\nb' | while read x ; do echo $x ; done

它只打印a.

于 2013-06-19T15:21:19.713 回答
0

read 将读取直到找到新行,当它找到新行时,它将返回该行。但如果文件结束时没有换行,read 会将其视为错误。因此,即使 read 已经用 read 到现在的行设置了返回变量,也设置了返回代码read来指示错误。现在while read ...这个循环体只有在命令执行成功时才会执行,这里不是这种情况。因此,您错过了最后一行。

为了克服这一点,您可以更改条件以检查返回变量是否为空。因此,即使读取失败,条件也会成功,因为变量已经设置到文件末尾。

这与不同操作系统中的行结尾无关,我的意思是它在某种程度上相关,但确切的根本原因始终是read在行/文件的末尾找不到新行,最后一行缺少循环体。

下面是一个例子

[[bash_prompt$]]$ echo -ne 'hello\nthere' > log
[[bash_prompt$]]$ while read line; do  echo $line; done < log
hello
[[bash_prompt$]]$ while read line || [ -n "$line" ]; do  echo $line; done < log
hello
there
[[bash_prompt$]]$
于 2013-06-20T10:24:34.367 回答
0

为了防止脚本不读取文件的最后一行:

cat "somefile" | { cat ; echo ; } | while read line; do echo $line; done

来源:我的开源项目https://sourceforge.net/projects/command-output-to-html-table/

于 2021-09-27T00:21:21.197 回答