2017-02-17 3 views
0

У меня есть файл, который я обрабатываю и получил застрявший формат: «HostRecord», «SOMEFILE», «InsideView», «legacy.name.com», «1.2.3.4» «1.2.3.5», «некоторый комментарий», «»Удаление котировок между двумя строками

мне нужно удалить «» между IP-адресами, но оставить , так, в конце концов, я бы выходной выглядеть следующим образом: «HostRecord "," SOMEFILE "," InsideView "," legacy.name.com "," 1.2.3.4.1.2.3.5 "," some comment "," "

Я думал, что я просто использую sed и попробовал несколько вещи. Мой последний что-то вроде этого:

sed -e 's/\(.*[0-9]\{1,3\}=1&\)\"\(,=2&\)\"\([0-9]\{1,3\}=3&\)/\1\2\3/' 

Это, кажется, не имеют никакого эффекта вообще, не очень разборчивы на конкретном инструменте, чтобы сделать работу, мне просто нужно, чтобы получить его завершения. У кого-нибудь есть мысли?

+0

Если IP-адрес всегда находится в одном и том же относительном положении, почему бы просто не просто получить доступ к этим элементам и вручную удалить «? например 'list [4] = list [4] [: - 1]; list [5] = list [5] [1:] '. – PrestonH

+0

Так что ясность, я полагаю, может помочь, файл длиной около 200 тыс. Строк, и не все записи имеют несколько IP-адресов, а некоторые строки имеют десятки IP-адресов. То, что я хотел сделать, это просто сделать быстрый сопоставление между последним октетом «,» и первым октетом следующего IP-адреса и просто удалить «out» – Elmore

+0

Итак, как вы узнаете, когда остановка IP? –

ответ

0

Почему бы не использовать что-то, что имеет реальную обработку CSV? Предполагая, что вы собираете IP-адрес, пока вы не получите то, что не взгляда как IP-адрес, это должно работать:

ruby -rcsv -e ' 
    cout = CSV.new $stdout, force_quotes: true 
    CSV.new(ARGF).each do |row| 
    out_row = row.shift(4) 
    ips = row.shift 
    while row[0] =~ /^\d+\.\d+\.\d+\.\d+$/ 
     ips += ",#{row.shift}" 
    end 
    cout << out_row + [ ips ] + row 
    end' infile.csv >outfile.csv 
0

Использование флага доступен в подстановке команды «s», (как общий г , p или d) мы можем заменить только N-й случай. Так, например:

<file sed 's/"//10' 

удалит 10 кавычку '"'

<file sed -e 's/"//11' -e 's/"//10' 

удалит 11th цитату, а затем 10-й цитаты на каждой строке

sed 's|\([0-9]\)","\([0-9]\)|\1,\2|g' 

.. Это сохранит каждую цифру [0-9], находящуюся вокруг ",", на две группы. Затем мы сможем заменить шаблон первой группой \1, а затем co ммa ,, а затем вторая группа \2. Мы добавляем флаг «g», который заставляет команду substitute работать в каждом случае, найденном в строке.

0

Допустим, у нас есть файл test_sed со следующими линиями:

"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4","1.2.3.5","some comment","" 
"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4","1.2.3.5","10.10.10.10","192.168.1.12","some comment","" 

Используйте два sed команды, хотя трубопровода последовательность (перенаправление вывода):

cat test_sed | sed -re 's#"(([0-9]{1,3}\.){3}[0-9]{1,3})","(([0-9]{1,3}\.){3}[0-9]{1,3})"#"\1,\3"#gp;' 
    | sed -rn 's#,(([0-9]{1,3}\.){3}[0-9]{1,3})","(([0-9]{1,3}\.){3}[0-9]{1,3}),#,\1,\3,#gp;' 

Выход:

"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4,1.2.3.5,10.10.10.10,192.168.1.12","some comment","" 
"HostRecord","SOMEFILE","InsideView","legacy.name.com","1.2.3.4,1.2.3.5,10.10.10.10,192.168.1.12","some comment","" 

([0-9]{1,3}\.){3}[0-9]{1,3}) представляет IP-адрес