Согласно приведенному выше комментарию Стивена Харриса, это прекрасно работает:
gpg -d -a < xAptive.ovpn.enc | sudo openvpn --config /dev/stdin
Неудачные попытки
Здесь нужно понимать два уровня. Сначала оболочка обрабатывает ввод, который затем передается на 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
.
Только ANSI цитирует escape-последовательности \033
,оставив остальное внутри нормально цитирую:
sed 's/\(!.*\)/'$'\033''E\1'$'\033''F/'
^^^^^^^^^^^^ ^^^^^ ^^^^
^^^^^^^ ^^^^^^^
Для захвата всей совпавшей строки не требуется группы захвата. То есть &
По умолчанию.
sed $'s/!.*/\033E&\033F/'
(Совместимость с POSIX. )Используйте Printf для создания ESC. Выберите один из
esc=$(printf '\033'); sed "s/!.*/${esc}E&${esc}F/"
sed "s/!.*/$(printf '\033')E&$(printf '\033')F/"
(Совместимость с POSIX )Awk.
awk '{sub(/!.*/, "\033E&\033F"); print}'