【问题标题】:Addressing a specific occurrence of a character in sed解决 sed 中特定出现的字符
【发布时间】:2011-08-07 05:17:30
【问题描述】:

如何删除或解决 sed 中出现的特定字符?

我正在编辑一个 CSV 文件,我想删除第三次和第五次出现逗号之间的所有文本(即删除第 4 和第 5 个字段)。有没有办法使用 sed 来实现这一点?

例如:

% cat myfile
one,two,three,dropthis,dropthat,six,...

% sed -i 's/someregex//' myfile

% cat myfile
one,two,three,,six,...

【问题讨论】:

  • 如果你真的有 CSV(例如,逗号分隔符可以用引号保护)那么不,不是没有大量代码,因为正则表达式不足以解析 CSV。 sed 作为图灵完备的语言,原则上可以计算任何可计算的函数,但使用真正的解析器要容易得多

标签: parsing csv sed awk


【解决方案1】:

如果可以考虑cut命令那么:

$ cut -d, -f1-3,6- file

【讨论】:

  • 最简单的答案可能是最好的。
【解决方案2】:

awk 或任何其他能够在分隔符上拆分字符串的工具比sed 更适合这项工作

$ cat file
1,2,3,4,5,6,7,8,9,10

Ruby(1.9+)

$ ruby -ne 's=$_.split(","); s[2,3]=nil ;puts s.compact.join(",") ' file
1,2,6,7,8,9,10

使用 awk

$ awk 'BEGIN{FS=OFS=","}{$3=$4=$5="";}{gsub(/,,*/,",")}1'  file
1,2,6,7,8,9,10

【讨论】:

  • awk 更适合字段处理,但请考虑输入字符串 1, "2,2", 3, 4, 5, 6。您还犯了与我在第一次尝试“删除第三个和第五个逗号之间的所有文本”时所做的相同的栅栏错误,即删除字段 4。
  • 我同意你的看法。此类情况需要处理。但与往常一样,我们对这些事情的研究过于深入,以至于由于信息不足而产生了冲突。如果 OP 的数据没有这种情况,那么使用简单的拆分就可以了。否则,使用 Python/Ruby/Perl 支持的真正解析器应该是更明智的选择。所有这些都由 OP 自行决定。
  • @msw:“删除第三个和第五个逗号之间的所有文本”,表示删除第四个和五个字段(第三个和第四个之间会删除第四列)。这就是我的回答。
【解决方案3】:

真正的解析器

#!/usr/bin/python

import csv
import sys

cr = csv.reader(open('my-data.csv', 'rb'))
cw = csv.writer(open('stripped-data.csv', 'wb'))

for row in cr:
    cw.writerow(row[0:3] + row[5:])

但请注意preface to the csv module

所谓的 CSV(逗号分隔 值)格式是最常见的 导入和导出格式 电子表格和数据库。有 没有“CSV 标准”,所以格式是 在操作上由许多人定义 读取和写入它的应用程序。 缺乏标准意味着 细微的差别往往存在于 产生和消费的数据 不同的应用。这些 差异会让人讨厌 处理来自多个的 CSV 文件 来源。尽管如此,虽然分隔符 并且引用字符不同, 整体格式足够相似 可以写一个 可以高效的模块 操纵这些数据,隐藏 阅读和写作的细节 来自程序员的数据。

$ cat my-data.csv
1
1,2
1,2,3
1,2,3,4,
1,2,3,4,5
1,2,3,4,5,6
1,2,3,4,5,6,
1,2,,4,5,6
1,2,"3,3",4,5,6
1,"2,2",3,4,5,6
,,3,4,5
,,,4,5
,,,,5
$ python csvdrop.py
$ cat stripped-data.csv
1
1,2
1,2,3
1,2,3
1,2,3
1,2,3,6
1,2,3,6,
1,2,,6
1,2,"3,3",6
1,"2,2",3,6
,,3
,,
,,

【讨论】:

  • +1 用于使用“真实”解析器。但是您需要删除字段 4 和 5。
  • 谢谢,已解决(第四次了,我保证现在要睡觉了)
猜你喜欢
  • 2020-03-30
  • 2016-03-20
  • 2019-11-17
  • 2015-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多