2012-12-05 32 views
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. 這樣做的正確方法是什麼?

    謝謝。

+0

你試過了嗎:'cat american.0 | tr'\ n'''' – BenjiWiebe

+0

它不起作用。 – rdllopes

+0

除了「無用的貓」位('tr'\ n''' twalberg

回答

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 

避免創建任何subshel​​l。

也就是說,根據this StackOverflow answer,你不能真正依靠一個shell變量能夠保存超過大約1KB的數據,所以你可能需要重新考慮你的整體方法。將整個單詞列表存儲在shell變量中可能不起作用,即使這樣做,也可能不起作用以及


編輯補充:要創建一個名爲/tmp/american.tmp一個臨時文件,其中包含什麼變量$a會的,你可以寫:

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

有一個在該行的一個問題: -bash:靠近意外的標記語法錯誤'做’ 所以,我改寫了對於: 一個=‘’;而IFS =讀取-r行;做一個=「$ a $行」; echo $ a;完成 rdllopes

+0

Thanx @ruakh。我正在嘗試使用臨時文件。 a =「」;而IFS =讀取-r行;做a =「$ {line%\\ n}」; echo $ a >> /tmp/american.tmp; echo $ a; done rdllopes

+0

@rdllopes:Re:語法錯誤:糟糕,有趣。我已經解決了我的答案。 Re:臨時文件的版本:換行符來自'echo'。要禁用它們,請使用'echo -n',或者更便攜的'printf%s'。 (另外,大部分代碼是無關的,你可以直接寫'while IFS = read -r line; printf%s「$ line」; done /tmp/american.tmp'。) – ruakh

0

如果要替換「\ n」與一個空間,你可以簡單地使用tr如下:

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

完美工作,在美國的'\ r'之前刪除。謝謝。但是,正如@ruakh告訴我的,可變大小有一個限制。 – rdllopes