讀陣列說我有文件foo.txt
用空格
"The" "quick brown" "fox" "jumps over" "the" "lazy dog."
我想從文件讀取這些「田」到數組。但是,如果該字段有一個空間,我的嘗試是失敗
$ read -a bar < foo.txt
$ echo ${bar[0]}
"The"
$ echo ${bar[1]}
"quick
讀陣列說我有文件foo.txt
用空格
"The" "quick brown" "fox" "jumps over" "the" "lazy dog."
我想從文件讀取這些「田」到數組。但是,如果該字段有一個空間,我的嘗試是失敗
$ read -a bar < foo.txt
$ echo ${bar[0]}
"The"
$ echo ${bar[1]}
"quick
使用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)
在文件平衡括號,括號中的命令替換之外使用,從而在它們之間的文本該文件作爲代碼執行而不是用於填充數組。
它不起作用。'echo $ {bar [0]}':'(「The」「quick brown」「fox」「」跳過「」the「 「看看我的解決方案 –
顯然,我在反例上比原來花了更多時間:)給定的文件適用於」-a「,但我無法找到一個很好的例子和壞例子,兩者都是使用相同數量的報價工作。 – chepner
這工作
$ read < foo.txt
$ eval bar=($REPLY)
$ echo ${bar[0]}
The
$ echo ${bar[1]}
quick brown
您的解決方案失敗,因爲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."
。我使用"
作爲分隔符,因爲這絕對不是用在單詞中。
下面是使用GNU awk
和FPAT變量的一種方法:
IFS=$'\n'
array=($(awk 'BEGIN { FPAT = "([^ ]+)|(\"[^\"]+\")" } { for (i=1; i<=NF; i++) print $i }' file.txt))
echo "${array[1]}"
結果:
"quick brown"
你想保持引號? – chepner
你想保留空格作爲字段分隔符還是可以替換它們並使用合適的IFS? – micke
@Ignacio Vazquez-Abrams:FYI。 –