Обращение к конкретному вхождению символа в sed - PullRequest
1 голос
/ 17 апреля 2011

Как мне удалить или устранить конкретное вхождение символа в sed?

Я редактирую файл CSV и хочу удалить весь текст между третьим и пятым вхождением запятой (то есть, удаляя поля четыре и пять).Есть ли способ добиться этого с помощью sed?

Например:

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

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

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

Ответы [ 3 ]

3 голосов
/ 17 апреля 2011

Если можно рассмотреть команду cut, тогда:

$ cut -d, -f1-3,6- file
2 голосов
/ 17 апреля 2011

Настоящий парсер в действии

#!/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:])

Но обратите внимание на предисловие к модулю csv :

Так называемый 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
,,
,,
2 голосов
/ 17 апреля 2011

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
...