gpt4 book ai didi

linux - Bash 脚本 : why is the last line missing from this file append?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:53:57 24 4
gpt4 key购买 nike

我正在编写一个 bash 脚本来逐行读取一组文件并执行一些编辑。首先,我只是尝试将文件移动到备份位置并按原样写出,以测试脚本是否正常工作。但是,它无法复制每个文件的最后一行。这是片段:

    while IFS= read -r line
do
echo "Line is ***$line***"
echo "$line" >> $POM
done < $POM.backup

我显然想在复制文件时保留空格,这就是我将 IFS 设置为空的原因。我可以从输出中看到正在读取每个文件的最后一行,但它从未出现在输出中。

我还尝试了另一种变体,它打印最后一行,但添加了一个换行符:

    while IFS= read -r line || [ -n "$line" ]
do
echo "Line is ***$line***"
echo "$line" >> $POM
done < $POM.backup

执行此读写操作的最佳方法是什么,以完全按照原样写入文件,使用正确的空格且不添加换行符?

最佳答案

添加换行 (LF) 的命令不是read 命令,而是echo 命令。 read 确实 返回仍然附加有定界符的行;相反,它会去掉分隔符(也就是说,如果分隔符出现在行中,IOW,如果它只是读取一个完整的行,它就会将其去掉)。

因此,要解决此问题,您必须使用 echo -n 来避免添加定界符,但当您有不完整的行时。

其次,我发现当为 read 提供 NAME(在您的情况下为 line)时,它会修剪前导和尾随空格,我认为你不想要。但这可以通过根本不提供 NAME 并使用默认返回变量 REPLY 来解决,这将保留所有空白。

所以,这应该可行:

#!/bin/bash

inFile=in;
outFile=out;

rm -f "$outFile";

rc=0;
while [[ $rc -eq 0 ]]; do
read -r;
rc=$?;
if [[ $rc -eq 0 ]]; then ## complete line
echo "complete=\"$REPLY\"";
echo "$REPLY" >>"$outFile";
elif [[ -n "$REPLY" ]]; then ## incomplete line
echo "incomplete=\"$REPLY\"";
echo -n "$REPLY" >>"$outFile";
fi;
done <"$inFile";

exit 0;

编辑:哇!来自 Charles Duffy 的三个极好的建议,这里是一个更新的脚本:

#!/bin/bash

inFile=in;
outFile=out;

while { read -r; rc=$?; [[ $rc -eq 0 || -n "$REPLY" ]]; }; do
if [[ $rc -eq 0 ]]; then ## complete line
echo "complete=\"$REPLY\"";
printf '%s\n' "$REPLY" >&3;
else ## incomplete line
echo "incomplete=\"$REPLY\"";
printf '%s' "$REPLY" >&3;
fi;
done <"$inFile" 3>"$outFile";

exit 0;

关于linux - Bash 脚本 : why is the last line missing from this file append?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28283576/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com