2012-04-18 131 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