Как grep(нуть) строку в файле с символами ESC
В файле присутствуют данные, например
echo -e "new file - \e[91mhello\e[0m" > file
Пытаюсь грепнуть эту строку:
grep "new file - hello" file
Не грепается ... less выводит: new file - ESC[91mhelloESC[0m
Если пробовать так:
grep "new file - ESC[91mhelloESC[0m" file
Выдает:
grep: Непарная [ или [^
Как это грепнуть?
Ответы (1 шт):
Автор решения: aleksandr barakin
→ Ссылка
grep: Непарная [ или [^
для непосредственного указания мета-символа типа [ надо добавить перед ним обратный слэш: \[.
символ escape имеет шестнадцатиричный код 1b:
$ mkdir tmp
$ ls -d --color tmp | hexdump -C
00000000 1b 5b 30 6d 1b 5b 30 31 3b 33 34 6d 74 6d 70 1b |.[0m.[01;34mtmp.|
00000010 5b 30 6d 0a |[0m.|
00000014
по умолчанию программе grep нельзя передать совсем уж произвольный символ (в виде шестнадцатиричного/восьмиричного кода). надо либо сформировать этот символ с помощью какой-нибудь другой программы, либо использовать опцию -P/--perl-regexp (если у вас реализация программы от проекта gnu). несколько вариантов:
$ ls -d --color tmp | grep -o -P '^\x1b\[0m' | hexdump -C
00000000 1b 5b 30 6d 0a |.[0m.|
00000005
$ ls -d --color tmp | grep -o "^$(printf '\x1b')\[0m" | hexdump -C
00000000 1b 5b 30 6d 0a |.[0m.|
00000005
$ ls -d --color tmp | grep -o "^"$'\x1b'"\[0m" | hexdump -C
00000000 1b 5b 30 6d 0a |.[0m.|
00000005