微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 在bash中同时从两个文件中读取它们可能缺少尾随换行符

我有两个文本文件,我试图逐行逐行阅读.这些文件不一定具有相同的行数,并且当脚本到达任一文件的末尾时,脚本应该停止读取.我想尽可能保持这种“纯粹”的打击.我发现这样做的大部分解决方案都表明了以下形式:

while read -r f1 && read -r f2 <&3; do
    echo "$f1"
    echo "$f2"
done < file1 3<file2

但是,如果文件的最后一行没有换行符,则会失败.

如果我只读一个文件,我会做类似的事情:

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo "$line"
done < file1

但是当我尝试通过以下方式扩展它来读取多个文件时:

while IFS='' read -r f1 || [[ -n "$f1" ]] && read -r f2 <&3 || [[ -n "$f2" ]]; do
    echo "$f1"
    echo "$f2"
done < file1 3<file2

要么

while IFS='' read -r f1 && read -r f2 <&3 || [[ -n "$f1" || -n "$f2" ]]; do
    echo "$f1"
    echo "$f2"
done < file1 3<file2

我似乎无法使逻辑正确,并且循环要么不终止或完成而不读取最后一行.

我可以使用以下方法获得所需的行为

while true; do
    read -r f1 <&3 || if [[ -z "$f1" ]]; then break; fi;
    read -r f2 <&4 || if [[ -z "$f2" ]]; then break; fi;
    echo "$f1"
    echo "$f2"
done 3<file1 4<file2

然而,这似乎不符合正常(?)

while ... read ...; do
     ... 
done

我看到的用于阅读文件的习语.

是否有更好的方法可以同时读取两个可能具有不同行数和最后一行不是换行符的文件

我阅读文件的方式有哪些潜在的缺点?

解决方法:

您可以覆盖&&的优先级.和||操作符将它们与{}分组:

while { IFS= read -r f1 || [[ -n "$f1" ]]; } && { IFS= read -r f2 <&3 || [[ -n "$f2" ]]; }; do

一些注意事项:在这种情况下,您不能使用()进行分组,因为这会强制其内容在子shell中运行,而子shell中读取的变量在父shell中不可用.另外,你需要一个;在每个}之前,所以shell可以告诉它不仅仅是最后一个命令的参数.最后,在每个读取命令之前需要IFS =(或等效IFS =”),因为作为命令前缀的赋值仅适用于该命令.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐