Наличие файла CSV, как это:
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
и ищет результат как:
HEADER
first, column|second "some random quotes" column|third ol' column
другими словами, удаляя "FOOTER", кавычки в начале, конце и вокруг |.
Пока этот код работает:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
Как видите, проблема в том, что он создает 4 дополнительных файла.
Вот еще одно решение, целью которого является не создавать дополнительные файлы и делать то же самое в одном скрипте. Это не очень хорошо работает.
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
sed
не собираетесь работать с этим, только с упрощенным CSV. Используйте язык программирования с библиотекой, которая может обрабатывать настоящие файлы CSV (Python / Perl / Ruby).Ответы:
Прежде всего, как показал Майкл, вы можете просто объединить все это в одну команду:
Я думаю, что некоторые
sed
реализации не справляются с этим и могут нуждаться:Тем не менее, похоже, что ваши поля определены,
|
и вы просто хотите удалить"
вокруг всего поля, оставляя те, которые находятся внутри поля. В этом случае вы можете сделать:Или с GNU
sed
:Вы также можете использовать Perl:
источник
Это также будет работать:
sed 's / ^ "//; s /" | "/ | / g; s /" "$ /" /'
Пример:
красивая версия
источник
FOOTER
, он удалит нужные данные.