我想获取一个文件,该文件的每一行都有一个单词列表,例如。
act
bat
cat
dog
eel
并将它们放在一行中,用逗号分隔并引用它们。结果是这样的:
'act', 'bat', 'cat', 'dog', 'eel',
因此,一个单引号,然后是单词,然后是另一个单引号,然后是逗号,然后是空格。然后输出到具有新名称的新文件。
答案1
短的printf
方法:
printf "'%s', " $(< file) > output
答案2
使用sed
和tr
:
$ sed -e "s/^/'/" -e "s/$/', /" file | tr -d '\n'
'act', 'bat', 'cat', 'dog', 'eel',
(输出末尾没有换行符)
在每行输入的开头和结尾插入sed
引号(以及后面的逗号和空格),同时tr
删除换行符。
将输出重定向到文件:
$ sed -e "s/^/'/" -e "s/$/', /" file | tr -d '\n' >newfile
答案3
使用awk
:
awk '{printf ("'\'%s\'', ", $0)}' infile > new_file
'act', 'bat', 'cat', 'dog', 'eel',
或者为了避免在末尾添加额外的逗号,请改用下面。
awk '{printf S"'\''"$0"'\''";S=", "}'
'act', 'bat', 'cat', 'dog', 'eel'
或者直接使用paste
而不加引号。
paste -d, -s infile
act,bat,cat,dog,eel
然后通过帮助引用它sed
:
sed -r "s/(\w+)/'\1'/g" <(paste -d, -s infile)
'act','bat','cat','dog','eel'
答案4
Perl 方法:
$ perl -lne '$sq="\x27";push @a,$sq.$_.$sq;END{ print join( ",",@a) }' input.txt
'act','bat','cat','dog','eel'
- 这里我们使用十六进制值作为存储在
sq
变量中的单引号,并且对于从文件读取的每一行,我们将其包装到单引号中 - 每行带单引号的行都被推入
a
数组 - 读取所有内容后, join 从每个数组项中创建一个文本字符串,通过以下方式连接
,
Python 方法也遵循同样的思路:
$ python -c 'import sys;sq="\x27";print ",".join([ sq + l.strip() + sq for l in sys.stdin ])' < input.txt
'act','bat','cat','dog','eel'
stdin
这里我们通过 shell<
操作符将输入文件重定向到命令的流中- 每行都通过 strip 方法从换行符中删除
\n
,通过 Perl 方法中描述的相同想法引用 - 所有行都通过结构处理成列表
[item for item in iterable]
(称为列表理解) - 最后
",".join()
让我们从所有列表项中创建一个漂亮的字符串