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

各コマンドは、親環境の個別のコピーを使用して、個別のサブシェルで実行されます。したがって、コマンドが作成する変数、または既存の変数に加えられる変更は、含まれているシェルによって認識されません。

あなたの場合、パイプラインは本当に必要ありません。

cat filename | command

必要なすべての点で、これと同等です。

command < filename

したがって、次のように書くことができます。

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

サブシェルの作成を避けるため。

とはいえ、この StackOverflow answerによると、シェル変数が約 1 ~ 4KB を超えるデータを保持できることに実際には依存できないため、おそらく全体的なアプローチを再考する必要があります。単語リスト全体をシェル変数に保存することはおそらくうまくいきません。


追加するために編集:/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 に答える