Bash: 将 `cat` 重定向到没有换行符的文件

Bash: redirect `cat` to file without newline

我确定这个问题已经在某个地方得到了回答,但是在搜索时,我找不到我的确切场景。我有两个文件,我正在将它们连接成一个文件,但我还在这两个文件之间添加了用户输入。问题是在第一个文件之后插入了一个换行符,其余部分按预期工作。

touch newFile
cat file1 > newFile
echo -n $userInput >> newFile
cat file2 >> newFile

如何在将 file1 添加到 newFile 时阻止或删除换行符?如果我 cat file1 似乎 cat 添加了一个换行符,但我看到的关于 cat 的所有信息都说它不会那样做。如果我 vim file1 文件末尾没有空行表明换行符是文件的一部分,那么 cat 实际上是在添加换行符,或者重定向 > 正在这样做,或者 echo 在其输出的开头添加一个换行符,在这种情况下需要 none。我看到的一种解决方案是使用

cat file1 | tr -d '\n'

但这会丢弃文件中的所有换行符,这也是不可取的。所以,重复我的问题:

如何 cat file1 进入新文件并添加用户输入而不在它们之间添加换行符?

cat 不是必需的,但我不熟悉 printf,所以如果这是解决方案,请详细说明它的使用)。

touch newFile
echo -n "$(cat file1)" > newFile
echo -n $userInput >> newFile
cat file2 >> newFile

成功了。

有了这些输入:

userInput="Test Test Test"

echo "Line 1
Line 2
Line 3" >file1

echo "Line 4
Line 5
Line 6" >file2

我会做:

printf "%s%s%s" "$(cat file1)" "$userInput" "$(cat file2)" >newfile

创建>newfile等同于touch并在第一步中添加内容。这样更容易看出意图。

我得到:

$ cat newfile
Line 1
Line 2
Line 3Test Test TestLine 4
Line 5
Line 6

像所有其他 Unix 工具一样,Vim 认为 \n 终止符 而不是行 分隔符 .

这意味着最后一段文本后的换行符将被视为最后一行的一部分,不会显示额外的空行。

如果没有尾随换行符,Vim 将在加载文件时在状态栏中显示 [noeol]

foo
~
~
~
~
~
"file" [noeol] 1L, 3C            1,1           All
        ^---- Here

所以不,换行符绝对是您文件的一部分,而不是 bash 以任何方式添加的。

如果你想删除所有尾随换行符,你可以这样做作为命令扩展的副作用:

printf '%s' "$(<file1)" >> newfile