如何将 sed 命令输出传递给变量而不丢失数据格式

如何将 sed 命令输出传递给变量而不丢失数据格式

我有一个包含五行的文件,其中包含管道分隔的数据。使用 sed 命令,我仅在每行末尾删除管道。但是,当我将下面的命令输出传递给变量时,数据会丢失格式,并且会出现在一行中。

我们如何将以下数据传递给变量以保持五行完整

sed 's/.$//' $input|sort

答案1

我不能 100% 确定,因为你还没有向我们展示你在做什么,但我猜你只是没有引用你的变量。例如,给定此文件:

$ cat file
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|
foo|bar|baz|

如果您对其运行命令并将输出保存在变量中,则将保存换行符。但是,是否打印它们取决于您如何打印变量:

$ var=$(sed 's/.$//' file | sort)
$ echo $var       ## bad
foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz foo|bar|baz
$ echo "$var"     ## good
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz
foo|bar|baz

当您使用不带引号的变量时,它会调用 split+glob 运算符,该运算符将根据$IFS变量中的字符拆分变量。默认情况下,这是空格、换行符和制表符:

$ printf '%s' "$IFS" | od -c
0000000      \t  \n
0000003

引用变量可以保护它免受 split+glob 的影响,这是您应该这样做的原因之一总是引用你的变量。有关原因的更多详细信息,请参阅忘记在 bash/POSIX shell 中引用变量的安全隐患

相关内容