如何从终端将文字 \n 作为文本写入文件中?

如何从终端将文字 \n 作为文本写入文件中?

我在终端中写下这个:

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

我得到这个note.txt

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

我想要得到这个note.txt

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

\- 不见了)

答案1

方法 1:逃避\您不想逃避其他角色的实例。

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

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

附加的文本如下note.txt

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

具体变化如下:

  • /n似乎想要一个换行符。因此我将其改为\n
  • 在文本中with "-e" and "\n"\旨在逐字打印,而不是与n后面的 组合并产生换行符。因此,我用\另一个引用(转义) \。如果\n产生换行符,\\n则产生\n
  • 我将外层的双引号 ( ") 替换为单引号 ( ')。您希望将和"周围的字符逐字打印出来,但它们却结束了并重新开始引用,从而阻止了它们被打印出来,并导致实际打印为(因为未加引号的字符在传递给 之前会被处理)。另一种解决方案是将 写为 内部字符。但是没有理由将整个内容括在双引号中——-e\n\nn\necho\""在可以使用单引号的情况下,通常最好使用单引号

    另一个变化——不是最终命令的变化,而是我做出的改变就在处理这件事的时候--我删除了>> note.txt重定向,直到我知道命令正确为止。通过将输出发送到终端,我立即能够看到效果。完成后,我重新添加了重定向。

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

方法 2:将echo命令分成不同的行,而不是使用-e

由于您希望 echo 特殊处理的唯一序列是\ntext和之间on),因此您只需使用两个单独的echo命令和(如muru 可能建议不是使用-e

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

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

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

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

    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"
    
  2. 单个重定向应用于由两个命令组成的复合命令。

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

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

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

方法 3:将文字传递\n给 ,echo而不是使用-e

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

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

因为第一行在引号内结束,所以 shell 不会将其视为命令的结束,而是继续读取。

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

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

方法 4:使用printf

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

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

的一般语法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:使用cat此处的文档。

这种方式在有大量输入和编写脚本时尤其有用。如果您以交互方式使用 shell 而不是编写脚本,则可以使用此方法,但请考虑方法 6下面首先。

echoprintf根据命令行参数的内容打印文本时,cat将打印其输入文件的内容(如命令行所指定),或者,如果没有指定(或传递-),则打印其标准输入

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

cat >> note.txt << EOF
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
EOF

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

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

但是对于其他应用程序您知道:

  • 上面显示的方式将执行扩展和替换,处理$`和 ,\特别是当它们出现在适用其特殊含义的上下文中时。
  • 为了使所有文本都按字面意思处理,请用 、 、 或它们的组合引用 右侧的全部或部分<<单词'"例如\cat >> note.txt << 'EOF'

方法 6:cat不使用任何输入重定向。

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

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

cat >> note.txt
writes (>> appends) in note.txt this text
on 2 lines (with "-e" and "\n" help)
^D

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

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

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

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

答案2

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

  1. 按,Ctrl++AltT
  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”)

答案3

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

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

$ printf %s 'A \n B \n'
A \n B \n

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

$ variable=Flimm
$ printf '%s is all right\n' "$variable"
Flimm is all right

你可以在命令手册bash手册页图标,搜索标题为 QUOTING 的部分。同时查看命令手册printf手册页图标

答案4

还有一个方法:

perl -e'打印 q{
这将保留 \n 反斜杠-n
以及除 close-squiggle 之外的其他特殊字符
(没有匹配的开放波浪线,这种情况非常罕见)
}' > note.txt

如果你的注释中有一条闭合曲线,你可以为 q() 函数选择另一个分隔符:

perl -e '打印 q|

即使是无匹配的紧密曲线也能正常工作
像这个: }

但如果我的文本中有管道,它就不起作用......

|'> 注释.txt

当然,如果你的文档中有单引号,所有这些方法(perl 或本机 printf)都将失败。在这种情况下,你可以使用双引号(只要你的文本中没有单引号和双引号)例如

printf %s “我是个白痴”

相关内容