замена двойных кавычек в CSV - PullRequest
6 голосов
/ 12 мая 2011

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

1223;"B630521 ("L" fixed bracket)";"2" width";"length: 5"";2;alternate A
1224;"B630522 ("L" fixed bracket)";"3" width";"length: 6"";2;alternate B

Как вы можете видеть, некоторые " написаны для дюйма и "L" во вложении ".

Теперь я ищу сценарий оболочки UNIX для замены двойных кавычек " (дюйм) и "L" на 2 одинарных, как в следующем примере:

sed "s/$OLD/$NEW/g" $QFILE > $TFILE && mv $TFILE $QFILE

Кто-нибудь может мне помочь?

Ответы [ 3 ]

3 голосов
/ 12 мая 2011

Обновление (с помощью Perl это легко, так как вы получаете полные функции просмотра)

perl -pe 's/(?<!^)(?<!;)"(?!(;|$))/'"'"'/g' file

выход

1223;"B630521 ('L' fixed bracket)";"2' width";"length: 5'";2;alternate A
1224;"B630522 ('L' fixed bracket)";"3' width";"length: 6'";2;alternate B

Использование sed, grep only

Просто используя grep, sed (а не perl, php, python и т. Д.) не слишком элегантное решение может быть:

grep -o '[^;]*' file | sed  's/"/`/; s/"$/`/; s/"/'"'"'/g; s/`/"/g' 

Вывод - для вашего входного файла он дает:

1223
"B630521 ('L' fixed bracket)"
"2' width"
"length: 5'"
2
alternate A
1224
"B630522 ('L' fixed bracket)"
"3' width"
"length: 6'"
2
alternate B
  • grep -o в основном делит ввод на ;
  • sed first заменяет "в начале строки на`
  • затем он заменяет "в конце строки на другой"
  • затем он заменяет все оставшиеся двойные кавычки " на одиночные вполне '
  • наконец он возвращает все " в начало и конец
3 голосов
/ 12 мая 2011

Может быть, это то, что вы хотите:

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g"

Т.е.: найти двойные кавычки (") после числа ([0-9]), но не ставить точку с запятой ([^;]), и заменить его двумя одинарными кавычками.

Edit: Я могу продлить свою команду (сейчас она становится довольно длинной):

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g"

Поскольку вы используете SunOS, я думаю, вы не можете использовать расширенные регулярные выражения (sed -r)? Поэтому я сделал это так: первая команда s заменяет все дюймы " на '', вторая и третья s одинаковы. Они заменяют все ", которые не являются прямыми соседями ;, на один '. Я должен сделать это дважды, чтобы иметь возможность заменить второй ", например, "L", поскольку между " есть только один символ, и этому символу уже соответствует \([^;]\). Таким образом, вы также замените "" на ''. Если у вас есть """ или """" и т. Д., Вам нужно поставить еще один (но только один) s.

2 голосов
/ 12 мая 2011

Для буквы "L" попробуйте это:

 sed "s/\"L\"/'L'/g"

Для дюймов вы можете попробовать:

sed "s/\([0-9]\)\"\"/\1''\"/g" 

Я не уверен, что это лучший вариант, но я пробовал ионо работает.Я надеюсь, что это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...