我使用echo
这两个命令之一将两个字符串打印到文件中:
echo -e "\n""x" >> ~/file
echo -e "\n" "x" >> ~/file
第一个结果是:
X
第二个结果是:
X
我想你没有错过额外的空间。
我最希望第二个命令的行为与第一个命令类似,因为"\n"
和之间的额外空格"x"
使阅读该命令更加舒适。
鉴于这在 Bash 4.3.48(1) 中自然不可能,是否有任何语法允许它或至少接近它?
主要目标是有一个间距,或者至少有一些占位符/分隔符,这将为我在两个字符串之间提供某种分隔,以便更舒适的阅读,但上面没有额外的空间。
请展示您知道的任何方式。我愿意使用其他东西echo
(尽管我更愿意避免使用here-string)。
请注意,我使用术语“字符串”来表示“ \n
”。我不确定这里的说法是否正确,但这是我描述这一点的最佳术语。
答案1
您可以使用以下命令执行此printf
操作:
printf '\n%s\n' 'x' >file
使用echo
,我可以使用tr
删除空格来完成此操作:
echo -e '\n x' | tr -d ' ' >file
也可以写成(但请不要):
echo -e '\n' 'x' | tr -d ' ' >file
结果:
$ cat file
x
我想也可以很容易地争论这些实际上会让你下命令更难读书。
答案2
如果关键点是在视觉上分隔脚本源中的两个字符串(此处为\n
和),我想您可以将它们放入变量中:x
str1='\n'
str2='x'
echo -e "$str1$str2" >> file
参数扩展当然是背靠背的,但字符串本身不是。
或者使用printf
,但添加尾部换行符必须单独完成:
{ printf %s $'\n' 'x'; echo; } >> file
%s
当然不会从参数字符串中扩展反斜杠转义符,但在 Bash 中我们可以使用$'...'
ANSI-C 引用echo
来获取最终的换行符。
或者定义一个函数来执行您想要的操作("$*"
将参数连接到函数,不带分隔符,因为IFS
此处已清除):
output() { local IFS=; echo -e "$*"; }
output "\n" "x"
答案3
x
如果目标是专门向文件中写入一个换行符和一个(以及另一个换行符?),并且在命令中不连续出现n
和x
(即 nx
)(并且在输出中不包含不需要的空格),则一种非常简单的方法是
{ echo; echo "x";} >> file
(写入换行符、x
、换行符),或
{ echo; echo -n "x";} >> file
(写换行符和x
,但最后没有换行符)。您还可以使用括号代替大括号进行分组:
(echo; echo "x") >> file
请注意,使用大括号时,在开始 后面必须有空格(空格、制表符和/或换行符) ,并且在结束 之前{
必须有一个(和/或换行符) 。或者您可以执行两个完全独立(未分组)的命令来独立执行重定向:;
}
echo >> file
echo "x" >> file
或者使用Jesse_b 的回答:
printf '\n%s\n' 'x' >> file
(写入换行符、x
、换行符),或
printf '\n%s' 'x' >> file
(写换行符和x
,但最后没有换行符)。
但如果目标更笼统——编写一堆字符串(中间没有空格),同时在命令行上用空格分隔它们,请考虑
printf '%b'细绳 …
其中%b
打印字符串的转换格式
和 \
序列解释(与按%s
字面打印字符串相反)。例如,
printf '%b' '\n' foo '\t' bar
将会写newlinefoo
tabbar
; IE,
富酒吧(末尾没有换行符)。你也可以说
printf '%b%b%b%b' '\n' foo '\t' bar
但你不需要;该格式将根据需要多次应用以显示所有参数。因此,如果你想在末尾添加换行符,
printf '%b\n' '\n' foo '\t' bar
不管用;它会在每个参数后添加一个换行符。你可以做
printf '%b' '\n' foo '\t' bar '\n'
(添加换行符作为最后一个参数),或者
printf '%b%b%b%b\n' '\n' foo '\t' bar
(计算参数),或者
{ printf '%b' '\n' foo '\t' bar; echo;}
另一种方法,如果您使用的是 bash,则为
printf '%s' $'\n' foo $'\t' bar
使用 bash 的符号来解释序列。将其应用于原来的问题,我们会得到$'text…'
\
printf '%s' $'\n' x
答案4
您可以使用%b
bash printf 的(解释反引号参数):
$ printf %b \\n x >> file
当然,你可以引用\n
:
$ printf %b '\n' x >> file
但要非常小心输入到 printf 的内容,因为任何反引号值都x
不会被 printf 解释。
或者,由于您使用的是 bash,它允许使用以下命令生成换行符$'\n'
:
$ printf '%s' $'\n' x >>file
比 安全一些%b
。
或者,如果你想要一个变量:
$ nl=$'\n'
$ printf '%s' "$nl" x >> file
或者你可以定义一个函数:
$ separate() { local IFS=; printf %b "$*"; }
$ separate '\n' 'x' '*'
将local IFS=
确保参数连接在一起(中间没有空格)"$*"