我有一个包含列表的文件:
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?的副本,因为我试图在加入时用双引号获取每个项目。
答案 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)
为此类大多数问题建立一般解决方案
使用常规start
,middle
和end
字符串
bash只有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 使用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"