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

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

有时候,最简单的事情会耗费你疯狂编写 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 
$

这似乎是您的文件的问题,它以两个换行符结尾,一个来自实际的$Contentvar,一个来自 echo。

如果这确实是问题所在,那么 aecho -n "$var" > Names.txt会给你一个只有一个结尾换行符的文件。

或者更好的是,这样做:

$ Content=$'me \n you \n him \n' 
$ printf '%s' "$Content" > Names.txt
$ cat Names.txt 
me 
 you 
 him
$

相关内容