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


29

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

我试图在字符串中用“ \ n”添加换行符:

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

但是这种方式不会创建三行的文件,而只会创建一行并包含字符串的逐字内容的文件。

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


Answers:


30

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

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

(但也请考虑您得到的其他答案。)

$'...'构造扩展了嵌入式ANSI转义序列。


1
请注意,这不是POSIX,是否可用在很大程度上取决于您使用的Shell。
克里斯·

1
您可以在显眼的shell(至少),ksh,bash,zsh(甚至其他)中找到该构造。
Janis

1
@ChrisDown,它还不是POSIX,但是计划包含在第8期中。ksh93,bash,zsh,mksh,FreeBSD sh支持它。
斯特凡Chazelas

24

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

使用GNU bash提供的回声(作为内置函数)和其他一些回声变体,您可以执行以下操作:

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

但是,这听起来确实像您想要的printf,这对我来说更清晰易懂,而且也更便于携带(它具有POSIX定义的此功能):

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

您也可以考虑使用here文档

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

我在外壳中尝试了您的cat>文件<<'EOF',当我按Enter时,每行都有这个>形提示,但即使按ctrl + x或ctrl + z,我也无法摆脱它
Abdul Al Hazred 2015年

您必须在一个输入行中单独输入EOF ...
Rmano

2
@mikeserv您是在嬉戏还是认真?

1
@AbdulAlHazred作为答案中的链接指示,它称为“此处文档”,非常常见。Wikipedia擅长于此主题:en.wikipedia.org/wiki/Here_document
dave_thompson_085

1
这个工作对我的Mac OSX(特别echo -en 'text..',而接受的答案不承认我的换行符(\n)时,echo -en做了。
benjaminmgross

4

以下是使用该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

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

请参阅外壳程序的控制和重定向运算符是什么?想要查询更多的信息。


2

要提供另一种选择,您可以点击Enter (即,文字换行符):

$ echo "the rain in spain
> falls mainly on the plain" > foo

请注意,不要>在第二行的开头键入。这是辅助shell提示符,$PS2当您键入不完整的命令(例如,在这种情况下,是带有不匹配的引号字符的命令)时,shell将显示该提示符。


0

POSIX 7说你不能

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

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

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

除非您具有可选的XSI扩展名。

因此printf改用:

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

文件格式符号

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

还请记住,Ubuntu 15.10和大多数发行版都实现了以下echo两者:

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

可能会导致一些混乱。


echo系统上每个可用的shell中都将内置一个内置程序。在Ubuntu上,/ bin / sh通常是破折号,默认情况下还提供bash。zsh,rc,mksh,yash,csh,tcsh,ksh93 ...都会具有不同的行为而具有各自的回显。请注意,which echo这不会为您提供所有Shell中系统回显的路径。
斯特凡Chazelas

@StéphaneChazelas“该回显不会为您提供所有shell中系统回显的路径。” 我不知道,还能给什么呢?
Ciro Santilli新疆改造中心法轮功六四事件2016年

在tcsh或zsh中尝试。which最初是(在80年代)仅用于csh用户的csh脚本(从〜/ .cshrc加载别名),并且仍在某些系统上。which是zsh和tcsh的内置函数。
斯特凡Chazelas
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.