如何在文件中将文字 \n 作为来自终端的文本写入?

Ilv*_*lvP 5 command-line bash

我在终端写这个:

printf ' \n\necho -e \"writes (>> appends) in note.txt this text'\n'on 2lines (with "-e" and "'\n'" help)\" >> note.txt\n' > note.txt 
Run Code Online (Sandbox Code Playgroud)

我得到了这个note.txt

echo -e "writes (>> appends) in note.txt this textnon 2lines (with "-e" and "n" help)" >> note.txt
Run Code Online (Sandbox Code Playgroud)

我想把它放进去note.txt

echo -e "writes (>> appends) in note.txt this text\non 2lines (with "-e" and "\n" help)" >> note.txt
Run Code Online (Sandbox Code Playgroud)

( \- 不见了)

Eli*_*gan 8

方式 1:转义\您不想转义其他字符的实例。

根据您的字符串的内容,您可能想要:

echo -e 'writes (>> appends) in note.txt this text\non 2 lines (with "-e" and "\\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)

附加的文本note.txt是:

writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
Run Code Online (Sandbox Code Playgroud)

变化是:

  • 您已经/n找到了想要换行的地方。所以我把它改成\n.
  • 在文本中with "-e" and "\n", the\旨在按字面打印,而不是与n下面的 it 组合并产生换行符。所以我\用另一个\. 如果\n产生一个新行,\\n产生\n
  • "用单引号 ( ')替换了外部双引号 ( )。你想要的"周围人物-e\n按字面打印的,而是他们结束并重新开始报价,防止它们被打印并造成\n实际被打印成n(因为不带引号的\n被传递到前处理echo)。另一种解决方案是\"为内部"字符编写。但是没有理由用双引号将整个内容括起来——在可以使用任何一个的情况下,单引号通常更可取

    另一个改变——不是对最终命令的改变,而是我在处理它时所做的改变——是我删除了>> note.txt重定向,直到我知道我拥有正确的命令。通过将输出发送到终端,我立即能够看到效果是什么。完成后我重新添加了重定向。

这在风格上与您已有的最接近,但这不是唯一的方法。

方式 2:echo为单独的行分开命令,而不是使用-e.

由于您希望通过 echo 专门处理的唯一序列是\n( betweentexton),因此您可以只使用两个单独的echo命令,并且(如muru 可能建议的那样不要使用-e.

以下是重定向多个命令的输出的两种方法:

  1. 两个单独的重定向,每个命令一个。

    writes (>> appends) in note.txt this text
    on 2 lines (with "-e" and "\n" help)
    
    Run Code Online (Sandbox Code Playgroud)

    如果文件名很长或者您正在编写脚本并且只想在一个地方更改它,您可以将它分配给一个变量:

    echo 'writes (>> appends) in note.txt this text' >> note.txt
    echo 'on 2 lines (with "-e" and "\n" help)' >> note.txt
    
    Run Code Online (Sandbox Code Playgroud)
  2. 应用于由两个命令组成的复合命令的单个重定向。

    out="/home/ek/Documents/long name that can have spaces as it's quoted/note.txt"
    echo 'writes (>> appends) in note.txt this text' >> "$out"
    echo 'on 2 lines (with "-e" and "\n" help)' >> "$out"
    
    Run Code Online (Sandbox Code Playgroud)

    如果您愿意,可以将其放在一行上,但如果在右大括号 ( })之前没有换行符,则;必须在它前面加上一个分号 ( ):

    {
        echo 'writes (>> appends) in note.txt this text'
        echo 'on 2 lines (with "-e" and "\n" help)'
    } >> note.txt
    
    Run Code Online (Sandbox Code Playgroud)

方式 3:将文字传递\necho而不是使用-e.

真正的换行符可以出现在引号内(单引号或双引号)并按字面解释:

{ echo 'writes (>> appends) in note.txt this text'; echo 'on 2 lines (with "-e" and "\n" help)'; } >> note.txt
Run Code Online (Sandbox Code Playgroud)

由于第一行在引号内结束,shell 不会将其作为命令的结尾,而是继续读取。

如果您确实想将其放在一行中,则可以使用$'\n',它会扩展为换行符。这传递给echo命令之前由 shell 展开,因此不应引用它。

echo 'writes (>> appends) in note.txt this text'$'\n''on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)

方式四:使用 printf

printf非常强大;有多种方法可以使用它来解决这个问题。由于我将此作为与其他解决方案不同的解决方案,因此这是一种以您无法使用的方式使用它的好方法echo

echo 'writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)

的一般语法printfprintf format args...(其中args...表示零个或多个附加命令行参数)。上面的格式字符串%s\n%s\n, 表示:

  1. %s:消耗并打印下一个未使用的(即第一个)参数args...(即您的第一行)。
  2. \n: 打印换行符。
  3. %s:消耗并打印下一个未使用的(即第二个)参数 args...(即您的第二行)。
  4. \n: 打印换行符。

当格式字符串后面的参数比格式字符串要求的多时,printf命令从格式字符串的开头重新开始。因此,虽然自我记录较少,但您实际上可以只为格式字符串编写'%s\n'(而不是'%s\n%s\n'),并且在这种情况下它会产生相同的输出。

我不会试图在printf这里广泛记录。相反,请参阅:

方式5:使用cathere文件。

当有大量输入和脚本时,这种方式特别有价值。如果您以交互方式使用 shell 而不是编写脚本,则可以使用它,但请先考虑下面的方式 6

Whileechoprintfprint 基于其命令行参数的内容打印文本,cat打印其输入文件的内容(在命令行中指定),或者,如果没有(或通过-),则打印其标准 input

没有重定向,标准输入就是您在程序的控制终端上键入的内容。这里的文件是一种特殊的重定向。收集行,直到指定的关键字(我使用过EOF)单独出现在一行上。然后将行到但不包括EOF(或您使用的任何内容)作为正在运行的命令的标准输入。

echo 'writes (>> appends) in note.txt this text'$'\n''on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)

"和引用之间的区别之一'是大多数扩展和替换$(例如,$varname)在双引号中执行,但没有一个在单引号中。也有两种使用 here 文档的方法,根据是$(以及`\)是否被赋予特殊含义或按字面处理。

在这种情况下,这无关紧要 -$并且`不会出现,并且\仅当它转义shell 元字符(不是n)时才在 here 文档中被特殊处理。就像在单引号和双引号表达式中一样,两种方式都按\n字面意思处理。(请记住,您必须使用 的特殊功能echo,由 开启-e,才能得到\n特殊对待。)

但是你知道其他应用程序:

  • 上面显示的方式将执行扩展和替换,处理$,`\special 当它们出现在其特殊含义适用的上下文中时。
  • 使被处理的字面上的所有文本,引述出现到右边的字的全部或一部分<<'"\,或它们的组合(例如,cat >> note.txt << 'EOF')。

方式 6:在cat没有任何输入重定向的情况下使用。

如果您以交互方式使用 shell,默认情况下,shell 的标准输入来自您的终端。当您然后运行一个程序时,默认情况下该程序的标准输入也来自您的终端。(当然,这可能会通过输入重定向来改变。)

因此,如果您以交互方式运行命令并希望使用catwith>>>output 重定向将数据发送到文件,则不需要任何输入重定向。只需输入:

printf '%s\n%s\n' 'writes (>> appends) in note.txt this text' 'on 2 lines (with "-e" and "\n" help)' >> note.txt
Run Code Online (Sandbox Code Playgroud)

代替^D,不要输入文字^D。而是按Ctrl+ D。这向您的终端发出信号,它应该报告文件结尾(即,当正在运行的程序要求更多输入时,它被告知没有剩余,就像它已经到达存储在磁盘上的常规文件的末尾一样) . 当cat看到没有更多输入时,它退出,您将返回到 shell。

如果您正在编写脚本,则方式 6 将不起作用,因为 bash 从文件中读取命令,但标准输入仍然(通常)是其他内容,例如您的终端。

使用cathere 文档和使用没有输入重定向的 cat之间的一个显着区别是,即使标准输入是您的终端,也是如此:

  • cat >> note.txt一次写入一行到note.txt. 每按一次Enter,就会向 写入一行note.txt
  • cat >> note.txt << EOF将所有输入带到该EOF行,然后将其附加到note.txt. 如果您按Ctrl+中断输入C,则不会写入任何内容(如果note.txt不存在,则甚至不会创建)。


dev*_*eek 1

好吧,我希望这能满足您的需求:

  1. 按, Ctrl+ Alt+T
  2. 键入以下命令:
    nano
  3. 终端中的编辑器将为您打开。
  4. 根据您的情况输入您想要的任何内容:(
    echo -e 'writes(>> appends) in note.txt this text/non 2lines (with "-e" and "\n" help)' >> note.txt这就是我从您的问题中得到的)
  5. 保存并退出
    • 按, Ctrl+X
    • 会要求保存确认消息,按y
    • 输入文件的名称,然后按Enter
  6. 去检查,
    • 打开文件管理器,您将看到您保存的文件。
    • 您可能会找到所有文本(包括“\n”)


Fli*_*imm 1

shell 会插入反斜杠等特殊字符,除非它被单引号括起来。

echo接受以破折号开头的参数,因此为了更加安全,您应该printf改为使用,如下所示:

$ printf %s 'A \n B \n'
A \n B \n
Run Code Online (Sandbox Code Playgroud)

%s只是意味着打印我作为参数传递的字符串。它经常这样使用:

$ variable=Flimm
$ printf '%s is all right\n' "$variable"
Flimm is all right
Run Code Online (Sandbox Code Playgroud)

您可以在命令的联机帮助页中找到有关 Bash 插值的更多信息bash联机帮助页图标,搜索标题为“引用”的部分。另请参阅printf命令的联机帮助页联机帮助页图标.