如何使用 echo 命令和重定向运算符将换行特殊字符放入文件中?

如何使用 echo 命令和重定向运算符将换行特殊字符放入文件中?

我想使用 echo 命令和重定向运算符创建一个文件,该文件应该由几行组成。

我尝试在字符串中包含“\n”换行符:

echo "first line\nsecond line\nthirdline\n" > foo

但是这样就不会创建包含三行的文件,而只会创建包含一行和字符串逐字内容的文件。

如何仅使用此命令创建包含多行的文件?

答案1

您要求在echo命令中使用一些语法:

echo $'first line\nsecond line\nthirdline' > foo

(但也要考虑一下你得到的其他答案。)

$'...'结构扩展了嵌入的 ANSI 转义序列。

答案2

echo 对字符转义的作用是由实现定义的。在 echo 的许多实现中(包括大多数现代的实现),默认情况下根本不检查传递的字符串是否有转义。

使用 GNU bash(作为内置)提供的 echo 以及其他一些 echo 变体,您可以执行如下操作:

echo -en 'first line\nsecond line\nthird line\n' > file

然而,它听起来确实像你想要的那样printf,这对我来说更清晰,也更便携(它具有 POSIX 定义的此功能):

printf '%s\n' 'first line' 'second line' 'third line' > file

您还可以考虑使用这里的文档:

cat > file << 'EOF'
first line
second line
third line
EOF

答案3

以下是使用命令创建多行文件的一些其他方法echo

echo "first line"  >  foo
echo "second line" >> foo
echo "third line"  >> foo

其中第二个和第三个命令使用>>重定向运算符,这会导致命令的输出被附加(添加)到文件(此时该文件应该已经存在)。

或者

(echo "first line"; echo "second line"; echo "third line") > foo

其中括号将echo命令分组到一个子进程中,该子进程的外观和行为类似于输出多行的任何单个程序(例如ls)。

上面的一个微妙的变化是

{ echo "first line"; echo "second line"; echo "third line";} > foo

这是轻微地比第二个答案更有效,因为它不会创建子流程。然而,语法有点棘手:请注意,在 后面必须有一个空格,{在 之前有一个分号}

shell 的控制和重定向运算符是什么?了解更多信息。

答案4

POSIX 7 说你不能

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e未定义,反斜杠是实现定义的:

如果第一个操作数是 -n,或者任何操作数包含 <反斜杠> 字符,则结果是实现定义的。

除非您有可选的 XSI 扩展。

所以使用printf反而:

格式操作数应用作 XBD 文件格式表示法中描述的格式字符串 [...]

文件格式表示法:

\n <newline> 将打印位置移动到下一行的开头。

另请记住,Ubuntu 15.10 和大多数发行版echo都将两者实现为:

  • 内置 Bash:help echo
  • 独立的可执行文件:which echo

这可能会导致一些混乱。

相关内容