Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux BASH将'cat'重定向到不带换行符的文件_Linux_Bash_Command Line_Newline_Cat - Fatal编程技术网

Linux BASH将'cat'重定向到不带换行符的文件

Linux BASH将'cat'重定向到不带换行符的文件,linux,bash,command-line,newline,cat,Linux,Bash,Command Line,Newline,Cat,我确信这个问题已经在某个地方得到了回答,但在寻找的过程中,我找不到确切的情况。我有两个文件,我连接成一个文件,但我也添加了两个文件之间的用户输入。问题是,在第一个文件之后插入了一个换行符,其余部分按需要工作 touch newFile cat file1 > newFile echo -n $userInput >> newFile cat file2 >> newFile 当file1添加到newFile时,如何防止或删除换行符?如果我看到cat文件1似乎有一个

我确信这个问题已经在某个地方得到了回答,但在寻找的过程中,我找不到确切的情况。我有两个文件,我连接成一个文件,但我也添加了两个文件之间的用户输入。问题是,在第一个文件之后插入了一个换行符,其余部分按需要工作

touch newFile
cat file1 > newFile
echo -n $userInput >> newFile
cat file2 >> newFile
当file1添加到newFile时,如何防止或删除换行符?如果我看到
cat文件1
似乎有一个由
cat
添加的新行,但我看到的关于
cat
的所有信息都表明它没有这样做。如果I
vim file1
文件末尾没有一个空行表示换行符是文件的一部分,因此
cat
实际添加了一个换行符,或者重定向
正在添加,或者
echo
在其输出的开头添加了一个换行符,在这种情况下,这些都是不可取的。我看到的一个解决办法是使用

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

这就成功了。

使用这些输入:

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
创建
>新文件
相当于
触摸
并在第一步中添加内容。这样更容易看出意图

我得到:

$ 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
因此,linefeed肯定是文件的一部分,而不是由bash以任何方式添加的

如果要去除所有后续换行,可以将其作为命令扩展的副作用:

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

printf'%s'$(三个反勾号是对Markdown的一个GitHub添加——它们不是基线语法的一部分,StackOverflow解析器不支持它们。使用由
{}创建的四个空格缩进
按钮,用于多行代码格式设置;这还可以启用语法突出显示,而在内容后面打勾的内容不会得到语法突出显示……不过,与内容而不是形式相比,您实际上是在删除文件中存在的一行;这是因为
$(…)
的输出中删除最后一个换行符…
——因此您的输出的换行符比输入文件的换行符要少;您不是在不添加换行符的情况下传递内容,而是在执行此操作时主动删除换行符。(另外,您当然需要
“$userInput“
,而不是
$userInput
,除非您希望运行代码的目录中的文件名列表替换为
*
;请参阅)。@charlesduff再次感谢所有这些解释,我一直很懒散,以至于我使用习惯力的三次回跳……现在也更清楚为什么“$(…)”实际上它是这样工作的。在VIM“隐藏”新行和$(…)删除该新行之间,我对我看到的行为感到完全困惑。感谢你解释它是如何工作的!(现在,是时候真正学习printf了,显然这是我现在应该知道的事情了)我假设您想要第三个
%s
,而不是格式字符串中的
$s
?尽管
printf“%s'”$(cat file1)“$userInput”“$(cat file2)”
也会有同样的效果。@CharlesDuffy:是的,谢谢,但奇怪的是,它还是可以工作的!当变量为空时,它的工作方式与
%s
%s
相同——在占位符用完时重复格式字符串。当
s
不为空时,事情会很有趣。:)太棒了,这绝对是一个更干净的解决方案,谢谢
printf“%s'$userInput”
比echo-n“$userInput”
更可靠;如果您看到,您会注意到
-n
定义了行为实现,并且标准的
应用程序用法
部分建议
printf
代替
echo-n
或任何带有反斜杠转义序列的
echo
调用。不确定为什么这个问题被否决,很明显,我误解了一些通过做合理数量的额外研究无法弄清楚的事情,我对我的问题做了足够的研究,认识到目前的答案不足以回答我的具体问题。通过问这个问题,我学到了许多新东西,因此它达到了目的@Charlesduff感谢您的帮助和详尽的解释!我不是一个完全的BASH/UNIX noob,但还有很多东西要学。这解释了很多,谢谢!我没有意识到VIM会像那样“隐藏”新词,所以我的问题是基于对新词来源的误解。我介于这个答案和我选择的答案之间,但另一个答案有更优雅的解决方案,但如果没有这个答案,我仍然会对整个VIM的事情感到困惑。因此,应添加一项功能,以选择多个答案组合作为解决方案:)
printf '%s' "$(<file1)" >> newfile