sed не завершается в конце этой строки (проблема с экранированием?)

#regex #sed

#регулярное выражение #sed

Вопрос:

Приложения 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/[^\]'[^,]/amp;\'amp;/g' testfile.txt
 

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

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

Комментарии:

1. ShellCheck указывает, что вы не можете экранировать одинарные кавычки обратной косой чертой, и что вы должны использовать ''' вместо just ' . Можете ли вы исправить это и повторить попытку?

2. Под «кавычками` вы подразумеваете обратные ссылки «`?

Ответ №1:

Я пробую это с помощью gnu sed,

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

$ sed -E "s/([^\]|^)'([^,]|$)/1\'2/" d
already escaped quote ' won't be escaped
 

Ответ №2:

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

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

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

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