我的文本文件类似于
first line
line nr 2
line three
等
我想生成
"first line",
"line nr 2",
"line three",
我想知道如何在python中执行此操作,或者如果它更容易/更快,可能在bash中执行此操作。我知道打开文件有不同的代码,并且在python(?)中只读取一行不同但我不确定在这种情况下使用哪个选项,更重要的是,如何添加这些字符。任何建议都会有所帮助。
答案 0 :(得分:8)
sed 's/.*/"&",/'
答案 1 :(得分:6)
供参考,以防有人想用python做同样的事情。有一个方便的模块fileinput可以像这样使用:
import fileinput
import sys, os
for line in fileinput.input(inplace=True):
sys.stdout.write('"%s",%s' % (line.rstrip(os.linesep), os.linesep))
然后将其作为脚本运行:
python myscript.py file1 file2 file3
这会为你改变文件。
答案 2 :(得分:6)
成为一名真正的unix极客:使用sed!
sed 's/^/"/; s/$/",/;' < your_text_file
如果要使用反斜杠转义现有双引号,请使用's/"/\\"/g; s/^/"/; s/$/",/;'
作为模式。
sed非常适合此类任务。查看一个可笑的长list of examples。
答案 3 :(得分:5)
无需为此任务构造正则表达式(使用反向引用)。它是一个昂贵的操作,因为你不会改变行中的东西。最简单的方法就是将它们打印出来。
awk '{print "\042"$0"\042,"}' file
对大文件操作的结果:
$ head -5 file
this is line
this is line
this is line
this is line
this is line
$ wc -l < file
9545088
$ time awk '{print "\042"$0"\042,"}' file >/dev/null
real 0m15.574s
user 0m15.327s
sys 0m0.172s
$ time sed 's/.*/"&",/' file > /dev/null
real 0m31.717s
user 0m31.465s
sys 0m0.157s
$ time perl -p -e 's/^(.*)$/\"$1\",/g' file >/dev/null
real 0m36.576s
user 0m36.006s
sys 0m0.360s
答案 4 :(得分:4)
一些简单的方法......
一个简单的perl oneliner:
perl -pi -e 's/^(.*)$/\"$1\",/g' /path/to/your/file
要解释一下,正则表达式^(.*)$
会抓住行的开头((.*)
)和行尾(^
)之间的所有内容($
) ),然后使用$1
匹配组变量用引号和逗号重建它。
答案 5 :(得分:1)
在Bash中:
while read line
do
echo "\"${line}\","
done < inputfile
答案 6 :(得分:1)
的Python
for line in open("file"):
line=line.strip()
print '"%s",' % line
答案 7 :(得分:0)
sh + awk在这里也很不错......
!/bin/sh
for FILE in "$@"
do
awk '{print "\" $0 "\","}' < $FILE > $FILE.tmp
mv $FILE.tmp $FILE
done
答案 8 :(得分:0)
在vi中:
:%s/^\(.*\)$/"\1",/g