Intereting Posts
распаковка tarball с жесткими ссылками на файловую систему, которая не поддерживает жесткие ссылки boot завершился с ошибкой «cryptsetup: lvm fs found, но не настроен lvm» Fedora 23 как установить драйвер для BCM43142 802.11? Удаление сообщений из очереди qmail без остановки qmail Помогите улучшить мои навыки AWK Как получить начальное время для несуществующего процесса в AIX? Создайте файл журнала с тем же именем, что и входной файл Сканирование Nmap для устройств с поддержкой SNMP Подсказка для ввода в пост-инсталляционный скрипт в dpkg минимальные требования к графическому интерфейсу linux Файлы Cat 2 и избегайте дублирования строк Как заменить несколько пустых строк на определенную непустую строку? Как вы переименовываете файлы в списке, который будет использовать wget? Какое устройство использует этот логический том? Автоматическое переключение на Wi-Fi

Удаление управляющих символов с помощью sed

У меня есть вход, поступающий из канала, который содержит специальные escape-символы. Для иллюстрации поток выглядит следующим образом:

printf "foo.bar\033[00m" > file cat file 

Как удалить конечный .bar\033[00m ? Я пробовал следующее, но это не работает:

 cat file | sed 's/\.bar\033[00m//' 

Если вы хотите на выходе только foo тогда

 printf '%s' 'foo.bar\033[00m' | sed 's/\.bar\\033\[00m//' 

Обратите внимание, что как \ и [ должны быть экранированы другим \ . Кроме того, я добавил '%s' в printf чтобы напечатать входные символы как литеральную строку, иначе \033[ можно было бы интерпретировать как escape-код, за которым следует цвет ANSI.

После редактирования вопроса: если ваш файл содержит контрольные символы, такие как

 printf "foo.bar\033[00m" > file 

то для его замены напишите следующее:

sed 's/\.bar Ctrl-v ESC \[00m//'

После нажатия Ctrl-v ESC вы должны увидеть ^[ на экране, но не буквально ^ и [ (два символа), а один управляющий символ.

Вам нужно избежать символа [ и \ с обратной косой чертой:

 printf '%s' "foo.bar\033[00m" | sed 's/\.bar\\033\[00m//' 

Кроме того, если вы хотите удалить все после символа точки в строке:

 printf "foo.bar\033[00m" | sed 's/\..*//'