Как в FreeBSD вставить управляющие символы ESC в файл?

Согласно приведенному выше комментарию Стивена Харриса, это прекрасно работает:

gpg -d -a < xAptive.ovpn.enc | sudo openvpn --config /dev/stdin

1
27.05.2021, 15:10
1 ответ

Неудачные попытки

Здесь нужно понимать два уровня. Сначала оболочка обрабатывает ввод, который затем передается на Sed.

  •  sed 's/\(!.*\)/\033E\1\033F/'
    

    Одинарные кавычки сохраняют буквальное значение всех символов. внутри, поэтому в этой первой попытке Сэд получает все символы между цитатами.

    Однако это не удается, потому что Sed не понимает \033как ASCII. восьмеричный 033 (ESC ). Вы могли предположить, что, но в руководстве Sed об этом ничего не сказано.

  •  sed $'s/\(!.*\)/\033E\1\033F/'
    

    Конструкция $'...'является кавычками ANSI C. Это хорошая идея потому что оболочка затем преобразует $'\033'в символ ESC. Однако руководство FreeBSD по Sh содержит список допустимых последовательностей обратной косой черты, а затем четко говорит

    Any other string starting with a backslash is an error.

    В нем перечислены \(или \)? Нет, поэтому сообщение об ошибке. И \1, то есть должен идти к Sed, также будет интерпретироваться как восьмеричное ASCII 001 (SOH ), что определенно не то, что вам нужно.

Решения

Обратите внимание, что для опций 1 и 2 ниже \033также можно записать просто как \e.

  1. Только ANSI цитирует escape-последовательности \033,оставив остальное внутри нормально цитирую:

    sed 's/\(!.*\)/'$'\033''E\1'$'\033''F/'
        ^^^^^^^^^^^^       ^^^^^       ^^^^
                    ^^^^^^^     ^^^^^^^
    
  2. Для захвата всей совпавшей строки не требуется группы захвата. То есть &По умолчанию.

    sed $'s/!.*/\033E&\033F/'
    
  3. (Совместимость с POSIX. )Используйте Printf для создания ESC. Выберите один из

    esc=$(printf '\033'); sed "s/!.*/${esc}E&${esc}F/"
    sed "s/!.*/$(printf '\033')E&$(printf '\033')F/"
    
  4. (Совместимость с POSIX )Awk.

    awk '{sub(/!.*/, "\033E&\033F"); print}'
    
2
28.07.2021, 11:30

Теги

Похожие вопросы