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