Bash cat多个文件

15

我正在尝试将三个文件拼接起来,并在每个文件之间插入一个换行符\n,我想到可以使用以下命令:

cat f1 f2 f3|tr "\EOF" "\n"

没有成功。

最简单的方法是什么?

6个回答

27
cat f1 <(echo) f2 <(echo) f3 <(echo) 
或者
perl -pe 'eof&&s/$/\n/' a b c

7
对于<(echo)这个习惯用法给出一个加一的赞。我在十多年的Bash脚本编写中不知怎么错过了它! - Adam Liss
请查看“进程替换”(process substitution),在缺少 /dev/fd 文件的系统上可能无法正常工作。 - Nahuel Fouilleul

9
EOF并不是一个字符,甚至不是CTRL-D - 这只是通常的终端输入中指示EOF的方法。因此,您不能使用用于翻译字符的工具来修改它。
对于这种简单的情况,最简单的方法是停止担心如何在单个cat中完成它 :-)
cat f1; echo; cat f2; echo; cat f3

will do the trick就可以了。如果文件数量更多的话,可能需要写一个脚本,但对于这种小情况来说,我看不出必要性。

如果你想将所有这些流合并以进行进一步处理,只需在子shell中运行它们即可:

( cat f1; echo; cat f2; echo; cat f3 ) | some_process

9

一旦您使用cat命令连接文件,它们之间将没有EOF,也没有其他方法可以找到边界,因此我建议使用以下命令:for file in f1 f2 f3; do cat $file; echo; done 或者带有缩进的:

for file in f1 f2 f3; do
    cat $file;
    echo;
done

1

我遇到了类似的问题,对我来说最好的解决办法是:

grep "" file1 file2 file3 | awk -F ':' '{print $2}'

1

如果你不仅限于使用cat工具,可以尝试使用bathttps://github.com/sharkdp/bat

bat -p file1 file2 file3

另外,如果您有动态文件计数,可以使用通配符:

bat -p *.extension

-3

试试这个:

find f1 f2 f3 | xargs cat

6
这不起作用,因为它与“cat f1 f2 f3”完全相同。我建议您修复或删除此答案。 - vadipp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接