使用累加器与shell脚本连接字符串

时间:2012-12-05 16:33:45

标签: string shell accumulator

我想转换一个用'\ n'分隔的列表,在另一个用空格分隔的列表中。 例如: 获取一个类似ispell english dictionary的字典。 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. 这样做的正确方法是什么?

    感谢。

2 个答案:

答案 0 :(得分: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。

也就是说,根据this StackOverflow answer,您不能真正依赖shell变量来容纳超过1-4KB的数据,因此您可能需要重新考虑整体方法。将整个单词列表存储在shell变量中可能不起作用,即使它存在,也可能无法正常运行


编辑添加:要创建名为/tmp/american.tmp的临时文件,其中包含变量$a所具有的内容,您可以写:

while IFS= read -r line; do
  printf %s " $line"
done < american.0 > /tmp/american.tmp

答案 1 :(得分:0)

如果您想用空格替换'\ n',您只需使用tr,如下所示:

a=$(tr '\n' ' ' < american.0)