BASH将cat重定向到没有换行符的文件

时间:2018-07-13 19:57:58

标签: linux bash command-line newline cat

我确定这个问题已经在某处得到了回答,但是在搜索时我找不到确切的情况。我有2个文件,这些文件将串联到一个文件中,但是我还在两个文件之间添加了用户输入。问题是在第一个文件之后插入了换行符,其余的按需工作。

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

当将file1添加到newFile时,如何防止或删除换行符?如果我cat file1似乎在cat处添加了换行符,但我看到的关于cat的一切都表示它没有这样做。如果我vim file1在文件末尾没有空白行,则表明换行是文件的一部分,因此cat实际上是在添加换行符,或者是重定向{{1} }正在执行此操作,或者>在其输出的开头添加换行符,在这种情况下都不希望使用任何换行符。我看到的一种解决方案是使用

echo

但是会丢弃文件中的所有换行符,这也是不希望的。因此,重复我的问题: 我如何cat file1 | tr -d '\n' 进入新文件并添加用户输入而不在它们之间添加换行符? (cat file1不是必需条件,但我不熟悉cat,因此,如果这是解决方案,请详细说明其用法。)

3 个答案:

答案 0 :(得分:2)

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

这意味着最后一段文本后的换行符将被视为最后一行的一部分,并且不会显示其他空白行。

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

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

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

如果要剥离所有尾随的换行符,可以将其作为命令扩展的副作用:

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

答案 1 :(得分:1)

使用以下输入:

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

答案 2 :(得分:0)

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

做到了。