在bash中将列表转换为单行字符串

时间:2017-01-30 14:55:22

标签: bash

我有一个包含列表的文件:

line1
line2
line3
.
.
.

我想在bash中加入字符串中的所有内容,如下所示:

"line1", "line2", "line3", ...... (no comma at the end)

我该怎么做?

编辑:这不是How to join multiple lines of file names into one with custom delimiter?的副本,因为我试图在加入时用双引号获取每个项目。

4 个答案:

答案 0 :(得分:2)

让我们说你的文件名是测试然后这会做的伎俩

  while IFS= read -r i; do echo " \"$i\""; done < test | paste -sd "," |sed 's/ //1'

答案 1 :(得分:2)

对于像

这样的输入文件
line1
line2
line3

我会使用sed和tr,如下所示:

$ sed 's/.*/"&"/;$!s/$/, /' infile | tr -d '\n'
"line1", "line2", "line3"

第一个sed命令引用每一行;第二行在除最后一行(, 地址:“而不是最后一行”)之外的每一行的末尾添加$!

tr然后删除所有换行符。

如果你想在Bash中完全做到这一点:

#!/bin/bash

mapfile -t arr < infile               # Read file into array
arr=("${arr[@]/#/\"}")                # Prepend " to each element
arr=("${arr[@]/%/\"}")                # Append " to each element
IFS=,                                 # Set separator to comma
str="${arr[*]}"                       # Comma separated string
printf '%s\n' "${str//\",\"/\", \"}"  # Insert space after commas

答案 2 :(得分:2)

为此类大多数问题建立一般解决方案 使用常规startmiddleend字符串

只有bash的解决方案:

#!/bin/bash

infile="infile"
start='"'
middle='", "'
end='"'

res="$start"                             # start the result with str "$start".
while  IFS=$'\n' read -r line            # for each line in the file.
do     res="${res}${line}${middle}"      # add the line and the middle str.
done   <"$infile"                        # for file "$infile"
res="${res%"$middle"}${end}"             # remove "$middle" on the last line.
printf '%s\n' "${res}"                   # print result.

使用awk解决大文件的问题:

#!/bin/bash

infile="infile"
start='"'
middle='", "'
end='"'

awk -vs="$start" -vm="$middle" -ve="$end" '
BEGIN{printf("%s",s)}
{
if(ll){printf("%s%s",ll,m)}
ll=$0
}
END{printf("%s%s%s",ll,e,"\n")}
' "$infile"

答案 3 :(得分:1)

使用awk:

$ awk '{ printf "%s\"%s\"", (NR==1?"":", "), $0 } END{ print "" }' file
"line1", "line2", "line3"