CAT 忽略换行符

时间:2021-03-20 00:10:15

标签: bash newline

我是一名学习者,我刚刚创建了一个新的 bash 脚本,该脚本从命令行读取两个文件名并将它们的内容连接起来打印。但是,它不起作用。我有两个文件:log1.txt 和 log2.txt,它们都以换行符结尾。我的代码基本上是这样的:

 File+=$(cat "$first")
 File+=$(cat "$second")
 echo "$File"

但是,第一个文件的结尾和第二个文件的开头合并为一行。我该如何解决?我已经在谷歌上搜索了几个小时,如果有任何帮助,我将不胜感激。

2 个答案:

答案 0 :(得分:0)

命令替换会修剪命令运行输出中的任何尾随换行符。这种行为是 POSIX 标准强制要求的——如果不这样做是没有意义的,因为 POSIX 规定 UNIXy 系统上的所有有效文本行必须以换行符终止;所以人们将需要不断地修剪尾随的换行符,否则的话。


但是,您没有理由将引入该换行符作为 shell 的问题:

cat 代表“连接”;当给定多个文件时,它将它们连接在一起。如果您没有传递多个参数,那么您通常一开始就没有充分的理由使用它。

File=$(cat "$first" "$second")

答案 1 :(得分:0)

Command substitutions 从内部的复合命令中删除标准输出末尾的任何尾随换行符(甚至多个换行符)。解决这个问题的两种主要方法是

  1. 确保命令替换以其他终止符结尾,然后将其删除或
  2. 使用命令替换以外的其他东西。

第一个的简单实现是这种模式:

name="$(some_command; echo x)"
name="${name%x}"

避免命令替换的最简单方法是将每个文件连接到一个单独的文件:

cleanup() {
    if [[ -d "$work_dir" ]]
    then
        rm --force --recursive "$work_dir"
    fi
}
trap cleanup EXIT
work_dir="$(mktemp --directory)"
aggregate_file="${work_dir}/aggregate"
cat "$first" > "$aggregate_file"
…