有时候,最简单的事情会耗费你疯狂编写 shell 脚本的时间。
Content='me \n you \n him \n'
echo $Content > Names.txt
当我打开它时,Names.txt
它末尾有两个空行。
我希望它只有一个空行。该Content
变量在循环中计算,并在每次迭代中添加一个新行。所以我无法改变Content
。
我无法使用,echo -n
因为它删除了所有新行。
我无法\n
从循环中删除 ,因为在这种情况下,所有行都会相互连接。
我尝试Content=$(echo $Content | awk 'NR>1{print PREV} {PREV=$0} END{printf("%s",$0)}')
使用awk
删除尾随换行符,但它不起作用。我是从这个网站上的一个答案中摘下来的。
我尝试使用printf %s $Content > File.txt
代替echo -e
,仍然没有成功。
如何从给定字符串变量中删除尾随换行符或将其按原样写入文件并告诉 Linux 不要向其中追加另一行?
答案1
这不是 Linux 添加第二个换行符,这是你调用时的 bash echo
!
因此,可以在 shell 内置函数的文档中找到答案man builtins
:
echo [-neE] [arg ...] Output the args, separated by spaces, followed by a newline. The return status is 0 unless a write error occurs. If -n is specified, the trailing newline is suppressed.
所以,echo -n
技巧就完成了。事实上,您需要使用echo -ne
,因为如果没有-e
,您的文件最终将包含文字字符串
me \n you \n him \n
(其中有“反斜杠n”!!)
我无法使用 echo -n 因为它会删除所有新行。
不,它不会那样做。
编辑:以下命令对话及其输出,在运行时bash
确认上述语句:
$ Content='me \n you \n him \n'
$ echo $Content > Names.txt
$ cat Names.txt
me \n you \n him \n
$ echo -e "$Content" > Names.txt
$ cat Names.txt
me
you
him
$ echo -en "$Content" > Names.txt
$ cat Names.txt
me
you
him
$
答案2
使用printf
格式%b
:
%b ARGUMENT 作为带有 '' 转义解释的字符串,但八进制转义的形式为 \0 或 \0NNN
$ Content='me \n you \n him \n'
$ printf "%b" "$Content" > Names.txt
$ cat Names.txt
me
you
him
答案3
引用和使用 printf 而不是 echo 可能是最好的习惯。
首先,你的描述不符合。如果你有一个变量 with'me \n you \n him \n'
那么它在任何地方都不会有换行符,不是 with echo $var
,nor printf '%s' $var
,也不是 with echo "$var"
orprintf '%s' "$var"
$ var='me \n you \n him \n'
$ echo $var
me \n you \n him \n
没有换行符,没有结束换行符(除了由 echo 添加的换行符)。
我相信你所拥有的是带有换行符的东西,其中你用 表示\n
。就像是:
$ var=$'me \n you \n him \n'
$ printf '%s' "$var"
me
you
him
$
这里的引用(非常)重要:
$ printf '%s' $var
meyouhim$
.........
$ echo $var
meyouhim
$
.........
$ echo "$var"
me
you
him
$
.....
注意 echo 引入的额外换行符吗?这是唯一一个被删除的echo -n
:
$ echo -n "$var"
me
you
him
$
这似乎是您的文件的问题,它以两个换行符结尾,一个来自实际的$Content
var,一个来自 echo。
如果这确实是问题所在,那么 aecho -n "$var" > Names.txt
会给你一个只有一个结尾换行符的文件。
或者更好的是,这样做:
$ Content=$'me \n you \n him \n'
$ printf '%s' "$Content" > Names.txt
$ cat Names.txt
me
you
him
$