2012-04-18 130 views
2

我想讀取文本文件,比如說file.txt,它包含多行。BASH - 從文本文件讀取多行

說的file.txt輸出

$ cat file.txt 
this is line 1 

this is line 2 

this is line 3 

我想存儲整個輸出作爲變量說,$text
當變量$text相呼應,預期輸出是:

this is line 1 this is line 2 this is line 3 

我的代碼如下

while read line 
do 
    test="${LINE}" 
done < file.txt 

echo $test 

輸出我得到的永遠只有最後一行。有沒有辦法將file.txt中的多行連接爲一個長字符串?

+0

提供迄今不工作的解決方案。 也許我應該更清楚地解釋我想要的... 我有一個名爲file.txt的文件,例如。該文件包含一句「這是第1行」「這是第2行」「這是第3行」。也就是說,文本文件中有3行。我想將這些行保存爲一個字符串連接在一個bash變量中,比如$ text。 – 2012-04-19 14:31:30

回答

3

可以翻譯\n(新行),以(空間):

$ text=$(tr '\n' ' ' <file.txt) 
$ echo $text 
this is line 1 this is line 2 this is line 3 

如果線與\r\n結束,你可以這樣做:

$ text=$(tr -d '\r' <file.txt | tr '\n' ' ') 
+0

[UUOC](http://partmaps.org/era/unix/award.html#uuk9letter) - 您可以使用'tr'\ n''' l0b0 2012-04-18 15:36:08

+0

我試過了,它只返回「這是第3行」 – 2012-04-19 14:24:10

+0

你的文件包含'\ r'。您可以通過命令刪除這些'\ r's:'tr -d'\ r'' – kev 2012-04-19 14:26:43

1

你要的內容追加您的變量的下一行:

while read line 
do 
    test="${test} ${LINE}" 
done < file.txt 

echo $test 

Resp。甚至更簡單,你可以簡單地讀取整個文件到變量中:

test=$(cat file.txt) 

resp。

test=$(tr "\n" " " < file.txt) 

如果你想保持換行符,因爲這將是簡單:

test=<file.txt 
+0

test = $(tr「\ n」「」 2012-04-19 14:26:14

+0

我認爲,kev用'tr -d'\ r''解決了這個問題 – bmk 2012-04-20 09:53:18

0

我相信這是最簡單的方法:

text=$(echo $(cat FILE)) 

但它不保留多單詞之間的空格/製表符。

+0

i試過這個。相同的結果,echo $ text返回文本文件中的最後一行。我想把一切都當作一個長串。 – 2012-04-19 14:33:26

+0

你可以用'echo $(echo $(cat file.txt))' – yazu 2012-04-19 14:37:35

+0

這是我做的,它返回最後一行 – 2012-04-19 14:41:53

0

使用陣列

#!/bin/bash 

while read line 
do 
    a=("${a[@]}" "$line") 
done < file.txt 

echo -n "${a[@]}" 

輸出:

this is line 1 this is line 2 this is line 3 

參見例如tldp section on arrays

+0

您可以使用'a + =($ something)'附加到數組。 tldp文章一般不是很好。你也可以使用'mapfile -t'來完成這個(bash v4),或者簡單地''在bash v3中讀'-d''-ra array jordanm 2012-04-18 15:55:44

1

還有一句:

line=$(< file.txt) 
line=${line//$'\n'/ } 
1
test=$(cat file.txt | xargs) 
echo $test 
+0

歡迎來到Stack Overflow!你會考慮增加一些敘述來解釋爲什麼這段代碼有效嗎?是什麼使它成爲這個問題的答案?這對詢問問題的人以及任何其他人來說非常有幫助。 – 2013-03-13 01:15:56