0

我想将一个用 '\n' 分隔的列表转换为另一个用空格分隔的列表。例如:获取像 ispell 英语词典这样的词典。http://downloads.sourceforge.net/wordlist/ispell-enwl-3.1.20.zip

我最初的想法是使用变量作为累加器:

a=""; cat american.0 | while read line; do a="$a $line"; done; echo $a

...但它会产生 '\n' 字符串!!!

问题:

  1. 为什么它不起作用?
  2. 这样做的正确方法是什么?

    谢谢。

4

2 回答 2

1

问题是当你有一个管道时:

command_1 | command_2

每个命令都在单独的子 shell 中运行,并带有父环境的单独副本。因此,该命令创建的任何变量,或它对现有变量所做的任何修改,都不会被包含的 shell 感知。

在您的情况下,您实际上并不需要管道,因为:

cat filename | command

在你需要的每一种方式上,都等同于:

command < filename

所以你可以写:

a=""; while read line; do a="$a $line"; done < american.0; echo $a

以避免创建任何子shell。

也就是说,根据这个 StackOverflow 答案,您不能真正依赖能够保存超过 1-4KB 数据的 shell 变量,因此您可能需要重新考虑您的整体方法。将整个单词列表存储在 shell 变量中可能不起作用,即使这样做,也可能无法正常工作


编辑添加:要创建一个名为/tmp/american.tmp包含变量的临时文件$a,您可以编写:

while IFS= read -r line; do
  printf %s " $line"
done < american.0 > /tmp/american.tmp
于 2012-12-05T16:38:07.293 回答
0

如果你想用空格替换'\n',你可以简单地使用tr如下:

a=$(tr '\n' ' ' < american.0)
于 2012-12-05T16:59:05.263 回答