如何消除尾随换行符并将结果存储在变量中

问题描述 投票:0回答:1

正如标题所说,我想消除尾随换行符并将结果存储在变量中(Bash)。

以下方法无效。

[xxx@ ~]$ var=`echo 'abc\ndef\n' | sed 's/\\n$//g'`
[xxx@ ~]$ echo $var
abc\ndef\n

以下作品!

[xxx@ ~]$ var=`echo 'abc\ndef\n' | sed 's/\\\\n$//g'`
[xxx@ ~]$ echo $var
abc\ndef

我认为 sed 只需要一个反斜杠转义,因为它用单引号引起来,但我想我的理解是错误的。

请告诉我为什么第二个命令可以正常工作?

bash sed escaping backslash single-quotes
1个回答
0
投票

关于:

请告诉我为什么第二个命令可以正常工作?

这两个命令都不起作用,不清楚为什么你认为它们都起作用。

echo 'abc\ndef\n'
产生以下输出:

$ echo 'abc\ndef\n'
abc\ndef\n

该输出中存在的唯一换行符是该行末尾的换行符,该换行符使其成为有效的 POSIX 文本文件。

\n
实际上是 2 个字符
\
\n

为了可移植性和一致性,您应该使用

printf
而不是
echo
。在这种情况下,它将把
\n
字符串转换为换行符:

$ printf 'abc\ndef\n'
abc
def

现在,要获取换行符的 RID - sed 默认情况下一次读取输入 1 行,因此您无法从 sed 看到的字符串中删除换行符,因为作为换行符分隔输入一部分的 1 行内不能有换行符。您可以使用 sed 执行操作以使其读取多行,但使用 awk 更强大且更便携,例如:

$ printf 'abc\ndef\n' | awk -v ORS= '1'
abcdef          <--- no newline at the end

或:

$ printf 'abc\ndef\n' | awk -v ORS= '1; END{print RS}'
abcdef          <--- no newline at the end

或类似,取决于您是否希望字符串以换行符结尾(因此是有效的 POSIX 文本行/文件)。

要执行命令,请将其结果存储在变量中,然后打印该变量的内容将是:

$ var=$(printf 'abc\ndef\n' | awk -v ORS= '1; END{print RS}')
$ printf '%s\n' "$var"
abcdef

请注意使用

$(...)
而不是长期弃用的反引号 (https://mywiki.wooledge.org/BashFAQ/082),以及 shell 变量周围必要的引号
"..."
(请参阅 https:// mywiki.wooledge.org/Quotes)。养成将代码复制/粘贴到 http://shellcheck.net 的习惯,它将帮助您查找并修复错误。

© www.soinside.com 2019 - 2024. All rights reserved.