我有一个包含五行的文件,其中包含管道分隔的数据。使用 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 中引用变量的安全隐患。