Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Bash中连接文件中的所有行?_Bash_Shell_Loops_While Loop - Fatal编程技术网

如何在Bash中连接文件中的所有行?

如何在Bash中连接文件中的所有行?,bash,shell,loops,while-loop,Bash,Shell,Loops,While Loop,我有一个文件csv: data1,data2,data2 data3,data4,data5 data6,data7,data8 我想将其转换为(包含在变量中): 变量=data1、data2、data2%0D%0Adata3、data4、data5%0D%0Adata6、data7、data8 我的尝试: data='' cat csv | while read line do data="${data}%0D%0A${line}" done echo $data # Fails, sin

我有一个文件
csv

data1,data2,data2
data3,data4,data5
data6,data7,data8
我想将其转换为(包含在变量中):

变量
=
data1、data2、data2%0D%0Adata3、data4、data5%0D%0Adata6、data7、data8

我的尝试:

data=''
cat csv | while read line
do
data="${data}%0D%0A${line}"
done
echo $data  # Fails, since data remains empty (loop emulates a sub-shell and looses data)

请帮助..

仅从文件中删除换行符更简单:

tr '\n' '' < yourfile.txt > concatfile.txt
tr'\n'concatfile.txt

无用地使用猫,受到惩罚!您希望将CSV馈送到循环中

while read line; do 
 # ...
done < csv
读行时
;做
# ...
完成
在bash中

data=$(
while read line
do
  echo -n "%0D%0A${line}"
done < csv)
数据=$(
读行时
做
echo-n“%0D%0A${line}”
完成
在非bash shell中,可以使用
`…`
而不是
$(…)
。另外,
echo-n
,它抑制了换行符,不幸的是,它不是完全可移植的,但这在bash中同样有效

awk 'END { print r }
{ r = r ? r OFS $0 : $0 }
  ' OFS='%0D%0A' infile  
对于shell:

数据=
而IFS=read-r;做
[-n“$data”]&&
数据=$data%0D%0A$答复||
数据=$REPLY
完成<填充
printf“%s\n”$data
最近的bash版本:

data=

while IFS= read -r; do
  [[ -n $data ]] &&
     data+=%0D%0A$REPLY ||
    data=$REPLY
done < infile

printf '%s\n' "$data"
数据=
而IFS=read-r;做
[-n$数据]]&&
数据+=%0D%0A$回复||
数据=$REPLY
完成<填充
printf“%s\n”$data

其中一些答案极其复杂。这个怎么样

 data="$(xargs printf ',%s' < csv | cut -b 2-)"
是的,
printf
可以是内置的。如果不是,但您的
echo
是,并且它支持
-n
,请改用
echo-n

data="$(echo -n "${data[0]}" ; for d in "${data[@]:1:${#data[@]}}" ; do echo -n ,"$d" ; done)"

好吧,现在我承认我有点傻了。安德鲁的回答完全正确。

另一个简短的bash解决方案

variable=$(
  RS=""
  while read line; do
    printf "%s%s" "$RS" "$line"
    RS='%0D%0A'
  done < filename
)
变量=$(
RS=“”
边读边做
printf“%s%s”$RS“$line”
RS='%0D%0A'
完成<文件名
)

我更喜欢循环:

for line in $(cat file.txt); do echo -n $line; done

注意:此解决方案要求输入文件在文件末尾有一个新行,否则将删除最后一行。

一个非常简单的单行解决方案,不需要额外的文件,因为它非常容易理解(我认为,只需将文件组合在一起并执行sed replace):


获取额外空间:这,是,一些,数据%0D%0A这,又是,数据%0D%0A第三行,of,数据%0D%0A第四行,in,数据%0D%0A正确。。。doh。编辑以添加
echo-n
.FYI,
$()
是标准配置。已经有好几年了。如果您想要一个可移植的
echo-n
使用
printf
获得额外的空间:这是,一些,数据%0D%0A这,同样是,数据%0D%0A第三行,of,数据%0D%0A第四行,in,数据%0D%0AInteresting,我不需要。它们是在源文件中还是在您的shell表达式中?
tr'\n'
像原始脚本一样打印出值。如果您在bash中的变量中不需要它-听起来像是这样-您就可以完全放弃它。它并没有对我“起作用”,而是让我找到了
tr-d'\n'
,效果很好:谢谢@Julien,您可以在“echo”“>>file.txt”前面加上前缀。并不总是可以修改源文件。您也可以使用临时副本。无论如何,你的解决方案是有效的;值得一提的是它的局限性或缺陷。
data="$(tr ' ' , <<<"${data[@]}")"
data="$(printf "${data[0]}" ; printf ',%s' "${data[@]:1:${#data}}")"
data="$(echo -n "${data[0]}" ; for d in "${data[@]:1:${#data[@]}}" ; do echo -n ,"$d" ; done)"
variable=$(
  RS=""
  while read line; do
    printf "%s%s" "$RS" "$line"
    RS='%0D%0A'
  done < filename
)
for line in $(cat file.txt); do echo -n $line; done
output=$(echo $(cat ./myFile.txt) | sed 's/ /%0D%0A/g')