Intereting Posts
Centos 7 больше не загружается Установка дополнения Firefox в глобальном масштабе без извлечения архива .xpi Разрешение MySQL отклоняло ошибку даже после установки контекста безопасности для SELinux на виртуальной машине применять специальную команду для каждого репозитория git Переменная окружения не сохраняется для JRE_HOME с sudoers Почему fio seq_writes намного быстрее, чем dd? Mediastream не действует Можно ли показывать текущий номер строки истории при выполнении обратного поиска в bash? Как использовать awk для чтения данных между всеми частыми временными интервалами SSH – Как сделать три компьютерных туннеля? Чтобы найти разницу между двумя строками одних и тех же файлов / proc / self / maps – 3-й отображаемый фрагмент файла? Удалять файлы старше 5 дней в UNIX (дата в имени файла, а не в метке времени) file-roller больше не использует один клик? Не удается удалить рубиновый камень Vagrant для установки Vagrant через RPM

Обработка исключений sed с экранированными символами

Я хочу удалить все, что следует за символом % до конца строки. С помощью

 cat /tmp/foo.txt | sed 's/%.*$//' 

отлично работает с одним исключением: я хочу игнорировать любые экранированные процентные знаки \% . Итак, со следующим файлом, сохраненным как /tmp/foo.txt

 abcd %123 xyz \%xyz xyz \%xyz %123 

выход, который я хочу, это

 abcd xyz \%xyz xyz \%xyz 

Какая уместная регулярная обработка исключений для этого?

Вам нужно посмотреть на персонажа перед процентом.

 sed 's/\([^\\]\)%.*/\1/' 

Если предыдущий символ не является обратным слэшем, сохраните этот символ и удалите остальные.

Этот ответ предполагает, что % не появляется в начале строки. Если это так, то нам нужно проверить это

 sed 's/\(^\|[^\\]\)%.*/\1/'