忽略回显字符串之间的间距

忽略回显字符串之间的间距

我使用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 如果目标是专门向文件中写入一个换行符和一个(以及另一个换行符?),并且在命令中不连续出现nx(即 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

将会写newlinefootabbar; 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

您可以使用%bbash 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=确保参数连接在一起(中间没有空格)"$*"

相关内容