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

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

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

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

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

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

 abcd xyz \%xyz xyz \%xyz 

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

One Solution collect form web for “Обработка исключений sed с экранированными символами”

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

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

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

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

 sed 's/\(^\|[^\\]\)%.*/\1/' 
  • Как сортировать слова по количеству слогов?
  • Раскрашивание вывода conky-cli в dwm
  • Использовать awk в качестве редактора потока
  • Как выделить данную строку в данном месте?
  • sed для печати шаблона, который охватывает линии
  • Какая версия sed не является GNU sed 4.0?
  • Изменение пары ключей значений массива с использованием sed или замены шаблонов или расширения фигурных скобок?
  • Как получить последние три последние даты файла журнала?
  • grep файл журнала, начиная с определенного времени и до конца файла
  • Что означает <<<?
  • Скопируйте первые 2 строки из файла, а затем удалите строки
  • Linux и Unix - лучшая ОС в мире.