卡在从字符串变量中删除尾随换行符上

Sae*_*ati 2 bash echo newlines

有时候,最简单的事情会耗费你疯狂编写 shell 脚本的时间。

Content='me \n you \n him \n'
echo $Content > Names.txt
Run Code Online (Sandbox Code Playgroud)

当我打开它时,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 不要向其中追加另一行?

Mar*_*ler 11

这不是 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.
Run Code Online (Sandbox Code Playgroud)

所以,echo -n技巧就完成了。事实上,您需要使用echo -ne,因为如果没有-e,您的文件最终将包含文字字符串

me \n you \n him \n
Run Code Online (Sandbox Code Playgroud)

(其中有“反斜杠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 
$ 
Run Code Online (Sandbox Code Playgroud)


sch*_*ity 6

使用printf格式%b

%b ARGUMENT 作为带有 '' 转义解释的字符串,但八进制转义的形式为 \0 或 \0NNN

$ Content='me \n you \n him \n'
$ printf "%b" "$Content" > Names.txt 
$ cat Names.txt 
me 
 you 
 him
Run Code Online (Sandbox Code Playgroud)