#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