Замена последовательно пустых значений в файле CSV - PullRequest
4 голосов
/ 22 июня 2011

У меня есть строка текста вроде:

value,value,,,value,value

Я хочу, чтобы два пустых значения были заменены другим значением.Что-то вроде:

value,value,hello,hello,value,value

Я сейчас пытаюсь что-то вроде:

sed -e 's/^,/hello,/' -e 's/,$/,hello/' -e 's/,,/,hello,/g'

, который ловит пустые значения в начале, конце и в середине.НО, он не перехватывает два последовательных пустых значения подряд.Как я могу обновить шаблоны регулярных выражений, чтобы в середине могло появляться неопределенное количество последовательных пустых значений?

Ответы [ 3 ]

4 голосов
/ 22 июня 2011

Как насчет этого perl one-liner:

echo ',value,,,value,' | perl -pe 's/^(?=,)|(?<=,)(?=,|$)/hello/g'
# hello,value,hello,hello,value,hello
2 голосов
/ 22 июня 2011

Я не думаю, что вы можете сделать это с помощью одной команды замещения, поскольку Sed заменяет только неперекрывающиеся вхождения вашего шаблона.Этот уродливый хак может сработать, но требует, чтобы вы не допустили еще одного символа (я выбрал ';') в ваших значениях:

$ echo 'value,value,,,value,value' | sed -r 's/,/,;/g;s/(^|;)(,|$)/\1hello\2/g;s/,;/,/g'
value,value,hello,hello,value,value
1 голос
/ 22 июня 2011

Другие однострочные perl:

perl -we '$_=<>; while(s/,,/,hello,/) {}; print;'  value.txt

perl -we 'print join ",", map { $_ || 'hello' } split /,/, <>;' value.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...