正如标题所说,我想消除尾随换行符并将结果存储在变量中(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 只需要一个反斜杠转义,因为它用单引号引起来,但我想我的理解是错误的。
请告诉我为什么第二个命令可以正常工作?
关于:
请告诉我为什么第二个命令可以正常工作?
这两个命令都不起作用,不清楚为什么你认为它们都起作用。
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 的习惯,它将帮助您查找并修复错误。