linux - shell 脚本给逗号分隔的内容添加双引号
黄舟
黄舟 2017-04-17 15:00:51
0
6
507

有個文件 a,其內容為:

1, 2, 3
$ head a
1, 2, 3

想把上面的文件转成如下的格式 用于 sql 条件查询中:

"1","2","3"

利用 awk 試了以下三種方式:

#多出了一个空行
$ awk -v 'RS= ' {print} a
1,
2,
3
#想通过这种方式删除空行 失败
$ awk -v 'RS= ' '{gsub(/^$/,"");print}' a
1,
2,
3
#3后面有个换行
$ awk -v 'RS= ' 'ORS=","{gsub(/,$/,"");print "\""$0"\""}' a
"1","2","3
",%

不知道有没更好的方式实现此功能?

黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(6)
伊谢尔伦
ruby -e 'print $_.gsub(/\d/){|i| %("#{i}")} while gets' a

解释:
1, ruby -e执行后面字串命令
2, $_表示gets的内容
3, gsub用于字串匹配替换
4, %(...), 用于生成字串, 否则要""#{i}"", 比较难看
5, gets, 会读入标准输入, 或文件

或更简单的使用sed:

sed 's,\([0-9]\),"",g' a

解释:
1, sed默认对文件的每一行执行动作
2, s表示进行文本替换
3, ,为分隔符, 可以是;, /, !
4, (...)表示正则表达式的'组', 以方便后面的1进行反向引用
5, [0-9]匹配数字
6, g表示替换所有匹配

巴扎黑

如果你不介意,可以使用 Python 来写 script:

步骤1: 利用 Python 写 script,取名 change(也可以是别的名字):

#!/usr/bin/python3

import sys

with open(sys.argv[1]) as reader:
    for line in reader:
        items = line.strip().split(',')
        print(', '.join(('"{0}"'.format(item.strip()) for item in items)))

步骤2: 记得在 script: change 最上方加入 shebang line (#! 再加上有效的 Python 路径)

#!/usr/bin/python3

步骤3: 将 script change 的权限改为可执行,比如说:

$ chmod change a+x

步骤4: 将 change 放到 PATH 中的任何路径下,比如说:

$ sudo mv change /usr/local/bin

之后就可以用它来转换拉:

$ change a
"1", "2", "3"
左手右手慢动作

同可以sed

  • cat a | sed -e 's,(s)+,1,g' -e 's,(S+),"1",g'

当然也有其它方式

  • cat a | perl6 -e 'dd .split(/s+/) for $*IN.lines'

阿神

看题主使用AWK的方式,以下是我测试可行的方案

代码:

awk 'gsub(/,/," "){for(i=1;i<=NF;i++){if(i<NF){printf "\""$i"\","} else{printf "\""$i"\""}}{printf "\n"}}' file.txt
PHPzhong

我来一个node版的:

#!/usr/local/bin/node

var fs = require('fs')
var args = process.argv.slice(2)
var text = ""
args.forEach(file => {
    try {
        text = text + "\n" + String(fs.readFileSync(file)).trim()
    } catch (e) {
        console.log(e.toString())
    }
})
if (text) {
    console.log(text.trim().split(/\n|,/).map(char => `\"${char}\"`).join(","))
}

可以这样使用:

$ chmod 755 change.js
$ node ./change.js a b

a文件的内容为1,2,3
b文件的内容为4,5,6

结果输出:"1","2","3","4","5","6"

注意:我用的是Mac,linux中跟Mac路径不一致,请使用which node查找node所在位置

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!