2012-10-16 57 views
3

讀陣列說我有文件foo.txt用空格

"The" "quick brown" "fox" "jumps over" "the" "lazy dog." 

我想從文件讀取這些「田」到數組。但是,如果該字段有一個空間,我的嘗試是失敗

$ read -a bar < foo.txt 

$ echo ${bar[0]} 
"The" 

$ echo ${bar[1]} 
"quick 
+2

你想保持引號? – chepner

+0

你想保留空格作爲字段分隔符還是可以替換它們並使用合適的IFS? – micke

+0

@Ignacio Vazquez-Abrams:FYI。 –

回答

5

使用declare,而不是eval

declare -a "bar=($(< foo.txt))" 

這將迫使所有的文件將被視爲作業的右側。使用eval,文件的內容可以解釋爲代碼。例如,如果該文件包含

Some text); echo "you just erased all your files"; (true 

然後將下面的由eval執行:

bar=(Some text); echo "you just erased all your files"; (true) 

在文件平衡括號,括號中的命令替換之外使用,從而在它們之間的文本該文件作爲代碼執行而不是用於填充數組。

+0

它不起作用。'echo $ {bar [0]}':'(「The」「quick brown」「fox」「」跳過「」the「 「看看我的解決方案 –

+0

顯然,我在反例上比原來花了更多時間:)給定的文件適用於」-a「,但我無法找到一個很好的例子和壞例子,兩者都是使用相同數量的報價工作。 – chepner

1

這工作

$ read < foo.txt 

$ eval bar=($REPLY) 

$ echo ${bar[0]} 
The 

$ echo ${bar[1]} 
quick brown 
+0

'eval bar =(\'cat foo.txt \')'也可以。 –

+1

'聲明「bar =($( chepner

+0

同意,'eval'不安全 –

0

您的解決方案失敗,因爲bash通常使用空格輸入字段分隔IFS(這也是爲什麼您會收到引號)。

可使用普通read,如果你準備你的文本處理:

IFS='"' 
read -a bar < <(sed 's/"\([^"]*\)" */\1"/g' foo.txt) 
echo ${bar[1]} 

quick brown 

注:sed命令將文件轉換爲以下格式:The"quick brown"fox"jumps over"the"lazy dog."。我使用"作爲分隔符,因爲這絕對不是用在單詞中。

0

下面是使用GNU awkFPAT變量的一種方法:

IFS=$'\n' 
array=($(awk 'BEGIN { FPAT = "([^ ]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }' file.txt)) 

echo "${array[1]}" 

結果:

"quick brown"