我在终端中写下这个:
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
\n
n
\n
echo
\"
"
在可以使用单引号的情况下,通常最好使用单引号。另一个变化——不是最终命令的变化,而是我做出的改变就在处理这件事的时候--我删除了
>> note.txt
重定向,直到我知道命令正确为止。通过将输出发送到终端,我立即能够看到效果。完成后,我重新添加了重定向。
从风格上来说,这与您已有的风格最接近,但这并不是唯一的方法。
方法 2:将echo
命令分成不同的行,而不是使用-e
。
由于您希望 echo 特殊处理的唯一序列是\n
(text
和之间on
),因此您只需使用两个单独的echo
命令和(如muru 可能建议)不是使用-e
。
以下是重定向多个命令输出的两种方法:
两个单独的重定向,每个命令一个。
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"
单个重定向应用于由两个命令组成的复合命令。
{ 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
的一般语法printf
是printf format args...
(其中args...
表示零个或多个附加命令行参数)。上面的格式字符串%s\n%s\n
表示:
%s
:使用并打印下一个未使用的(即第一个)参数args...
(即第一行)。\n
:打印换行符。%s
:使用并打印下一个未使用的(即第二个)参数args...
(即第二行)。\n
:打印换行符。
如果格式字符串后面的参数多于格式字符串所要求的参数,则命令printf
将从格式字符串的开头重新开始。因此,虽然不太具有自文档性,但您实际上可以只为格式字符串编写'%s\n'
(而不是'%s\n%s\n'
),并且在这种情况下会产生相同的输出。
我不会尝试printf
在这里进行广泛的记录。相反,请参阅:
- 的输出
help printf
。 printf
的子部分4.2 Bash 内置命令在bash 参考手册。- 本手册页记录了标准 printf 命令(bash 稍微延伸了一点)。
printf()
该命令所基于的标准 C 库中的函数,printf
在上述资源中明确引用。有关它的文档,例如此页面,比大多数有关该printf
命令的资料更详尽,也更易于理解。格式字符串语法也非常相似。
方法 5:使用cat
此处的文档。
这种方式在有大量输入和编写脚本时尤其有用。如果您以交互方式使用 shell 而不是编写脚本,则可以使用此方法,但请考虑方法 6下面首先。
echo
和printf
根据命令行参数的内容打印文本时,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
好吧,我希望这能满足您的需求:
- 按,Ctrl++AltT
- 输入以下命令:
nano
- 终端中的编辑器将为您打开。
- 根据您的情况,输入您想要的任何内容:(
echo -e 'writes(>> appends) in note.txt this text/non 2lines (with "-e" and "\n" help)' >> note.txt
这是我从您的问题中得到的) - 到保存并退出,
- 按Ctrl+X
- 将要求确认信息节省, 按y
- 输入文件的名称,按Enter
- 去检查,
- 打开文件管理器,您将看到已保存的文件。
- 您可能会找到所有文本(包括“\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 “我是个白痴”