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

问题描述 投票:0回答:3

我将两个文件连接成一个文件,但我还在两个文件之间添加了用户输入。问题是在第一个文件之后插入了换行符,其余部分按需要工作。

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

如何在将 file1 添加到 newFile 时防止或删除换行符?如果我

cat file1
似乎有一个由
cat
添加的换行符但是我看到的关于
cat
的一切都说它不会那样做。如果我
vim file1
文件末尾没有空行表明换行符是文件的一部分,那么
cat
实际上是在添加换行符,或者重定向
>
正在这样做,或者
echo
在其输出的开头添加一个换行符,在这种情况下都不是可取的。我看到的一种解决方案是使用

cat file1 | tr -d '\n'

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

如何

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

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

linux bash command-line newline cat
3个回答
3
投票

有了这些输入:

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

3
投票

像所有其他 Unix 工具一样,Vim 认为

\n
一行 terminator 而不是一行 separator

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

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

[noeol]

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

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

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

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

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

成功了。

© www.soinside.com 2019 - 2024. All rights reserved.