регулярное выражение заменить: '[A-Z]' 'на [A-Z]' - я не могу сохранить букву в строке - PullRequest
2 голосов
/ 02 февраля 2012

Мой гугл фу подводит меня ...

У меня есть файл (более 2 гигов), в котором есть проблема с форматом SQL.Поэтому мне нужно регулярное выражение, которое обновит следующие примеры (помните, я не знаю, сколько их или какие буквы):

  1. 'N' 'следует заменить на N'
  2. 'L' 'должен быть изменен на L' и т. Д.

Я пробовал (в VIM и sed):

s/'[A-Z]''/$1'/

, но это просто приводит к:

'N'' -> '$1'

Ответы [ 2 ]

4 голосов
/ 02 февраля 2012

Обратная ссылка в sed: \1, а не $1.Вам также нужно захватить букву, используя \(\) (и, вероятно, использовать глобальный флаг g).

Ваше выражение sed должно быть:

s/'\([A-Z]\)''/\1'/g
1 голос
/ 02 февраля 2012

Дайте этому шанс:

sed "s/\([[:alpha:]]'\)'/\1/g" file

Пример вывода

$ sed "s/\([[:alpha:]]'\)'/\1/g" <<<"aBcD''eg''H'i"
aBcD'eg'H'i

Примечание : Поскольку вы сказали, что не знаете, какими они будут буквами, я предположил, что они могут быть строчными. Если вы точно знаете, что они всегда в верхнем регистре, измените значение [[:alpha:]] на [[:upper:]]. Эти классы символов предпочтительнее, чем [A-Za-z] и [A-Z] соответственно, потому что они всегда будут работать так, как вы ожидаете, независимо от локали.

...