sed не завершается в конце этой строки (проблема с выходом?) - PullRequest
0 голосов
/ 17 апреля 2019

Приложения SQL, которые я использую, должным образом не экранируют все имеющиеся у меня строки, поэтому я пытаюсь использовать sed для замены этих экземпляров. Вопрос у меня будет такой:

`some string of characters that may include hyphens'
and the quote at the end won't get escaped (yes that's supposed to be a ` not a quote).

Я планировал использовать это:

sed 's/[^\\]\'[^,]/&\\\'&/g' testfile.txt

Логика: все, что не является обратной косой чертой, за которой следует кавычка, затем все, что не является запятой, будет заменено тем же текстом с обратной косой чертой и кавычкой.

Я бы хотел, чтобы в testfile.txt все экземпляры 'заменялись на \', но я просто продолжаю получать>, как если бы это не было сделано, строка

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Я пробую это с помощью GNU SED,

$ cat d
already escaped quote \' won't be escaped

$ sed -E "s/([^\\]|^)'([^,]|$)/\1\\\'\2/" d
already escaped quote \' won\'t be escaped
0 голосов
/ 17 апреля 2019

То, что вы ищете, называется косвенными утверждениями, где вы соответствуете любому ', которому не предшествует \ или за которым следует конец строки.К сожалению, sed не поддерживает их.Но вы можете использовать Perl:

perl -pe 's/(?<!\\)'\''(?!$)/\\'\''/g' testfile.txt

В неэкранированном виде это будет выглядеть как s/(?<!\\)'(?!$)/\\'/g, но мы должны сделать поправки для оболочки.В одинарных кавычках не распознаются экранированные символы, поэтому исходная проблема была \' не распознана, а строка заканчивалась досрочно.

См. Здесь пример и подробную разбивку регулярных выражений: https://regex101.com/r/k8sonu/1

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