Минимальное исправление - удвоение символа кавычки в этом конкретном месте в вашем тестовом вводе - достаточно просто с помощью чего-то sed
или любого другого инструмента, который может выполнять основной поиск / замену:
$ sed 's/55" bsgdf/55"" bsgdf/' file.in > file.out
Предполагается, что файл file.in
содержит соответствующую строку и что шаблон 55" bsgdf
появляется только в том месте, где требуется обновление.
Ваша настоящая проблема на самом деле большеобщие?
Общепринятое соглашение для файлов в формате CSV - заключать в кавычки значения, используя символ кавычки ", а когда символ кавычки является частью значения, удвойте его - т. е. используйте" "- длязакодируйте его.
Например, для кодирования значений:
- Нью-Йорк, Нью-Йорк
- 179,98
- Специальная ставка "149,99 $"
строка в CSV-файле будет выглядеть следующим образом:
"New York, New York","$179.98","Special rate ""$149.99"""
Но довольно просто создавать поврежденные CSV-файлы, наивно испуская строки, такие как:
"<val1>","<val2>",...,"<valN>"
... для значений, которые включают символы кавычек, но забываяизбежать / удвоить кавычки в этих значениях.Вышеприведенный пример будет ошибочно выдаваться как:
"New York, New York","$179.98","Special rate "$149.99""
Мне кажется, что вы имеете дело с файлами, которые имеют эту последнюю проблему.
Часто можно исправить такие беспорядки, хотяОбщее решение невозможно (рассмотрите проблему, с которой вы столкнулись, если некоторые отдельные значения выглядят как "a","b","c"
).
Но если ваши данные не включают такие проблемные случаи, рассмотрите что-то вроде следующего.Это довольно грубо, преобразование CSV в не заключенные в кавычки текстовые данные с разделителями каналов, удвоение оставшихся символов кавычек, а затем преобразование с разделителями каналов обратно в CSV.Если ваши данные, естественно, содержат символ канала |
, вам нужно использовать какой-то другой промежуточный разделитель.
#!/bin/sh
# sed commands (-e <cmd>)
#
# delete leading "
# delete trailing "
# replace all "," sequences with |
# replace all " chars with ""
# return all | chars to ","
# append trailing "
# prepend leading "
#
# Assumes that the pipe character '|' is not part of data
sed \
-e 's/^"//' \
-e 's/"$//' \
-e 's/","/|/g' \
-e 's/"/""/g' \
-e 's/|/","/g' \
-e 's/$/"/' \
-e 's/^/"/'
Сохраните вышеприведенное, скажем, double_quotes.sh
, сделайте файл исполняемым и используйтечерез что-то вроде:
$ ./double_quotes.sh < file.in > file.out
Приведенное выше разделяет некоторые понятия с ответом на основе perl
от @ stack0114106: а именно, использование последовательности шагов замещения, применяемых по порядку.Такие последовательности часто больно читать и понимать, но они являются основными инструментами такого рода.