Sed: Попытка перевести искомую группу в выполнение оболочки для форматирования вывода - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь написать скрипт, который будет делать подсветку журналов для удобства чтения. Проблема, с которой я сталкиваюсь - это попытка сопоставления с подстановочным знаком, а также попытка печати подстановочной переменной. В моем файле я ищу "psuslot- *" (может быть 1 или 2). Цель состоит в том, чтобы выделить строку «psuslot-1» или «psuslot-2» в строке журнала. Моя текущая команда, с которой я тестирую:

cat file.txt | sed "s|\(psuslot-.\)|$(printf "\033[93m"\1"\033[0m")|"

Обозначает это в выходных данных: 1

Я знаю, что группы относительно корректны, так как эта команда сохраняет правильная группа:

cat file.txt | sed "s|\(psuslot-.\)|\1|"

Сохраняется в выходных данных: psuslot-1 и psuslot-2

Использование групп захвата выглядит не слишком хорошо для выполнения оболочки , Есть ли способ перевести подстановочный знак в выполнение?

1 Ответ

1 голос
/ 10 марта 2020

Вы можете использовать

sed 's|\(psuslot-.\)|\o33[93m\1\o33[0m|'

или менее читабельный

sed 's|\(psuslot-.\)|'$(printf '\033[93m')'\1'$(printf '\033[0m')'|'

Я взял синтаксис для восьмеричного значения из руководства GNU sed: Escape-последовательности - указание специальных символы

\oxxx Создает или соответствует символу, восьмеричное значение ASCII которого равно xxx.

И \o033 дали тот же результат, что и \o33 ( такой же, как шестнадцатеричный \x1b), поэтому я взял более короткий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...