как сопоставить несколько шаблонов и изменить одну часть с помощью sed

Терминалы отличаются от других форм ввода-вывода, и эмулятор терминала должен представлять себя как терминал.

  • Терминал (включая псевдотерминал) имеет определенные атрибуты, такие как длина строки и поддерживаемые управляющие последовательности. Программы могут запрашивать их, например, в общем случае ls определит, идет ли его вывод на терминал, а затем настроит свои цвета и табуляцию в соответствии с терминалом.

    Вы можете проверить это: ls | cat не даст вам отдельных колонок. Псевдотерминал используется для передачи соответствующих значений для эмулятора терминала.

    В качестве другого примера, такие программы, как sudo и ssh, в целях безопасности будут считывать пароль из терминала напрямую, вы не можете передать их по трубе.

  • Терминалы используются для управления процессами. Если вы нажмете ^C, терминал отправит SIGINT в свой процесс переднего плана. Это работа терминала. Это означает, что для того, чтобы такие вещи, как ^C работали, должен существовать терминал.

    Аналогично, если положить трубку на терминал (или в современной системе закрыть окно эмулятора терминала), то все процессы, связанные с ним, пошлют SIGHUP.

    Псевдотерминал справляется с этим, пара труб - нет.

    Вообще, все процессы, кроме демонов, имеют управляющий терминал. Вы можете использовать ps, чтобы узнать, какие процессы принадлежат каким терминалам.

3
10.05.2017, 21:04
3 ответа

sed подход:

sed -i 's/^\(SUT_INST_EXAMPLES\|SUT_INST_PING\)=false/\1=true/' file

файл содержимое:

SUT_INST_PIT=true
SUT_INST_TICS=true
SUT_INST_EXAMPLES=true
SUT_INST_PING=true

\(SUT_INST_EXAMPLES\|SUT_INST_PING\) - группа чередования, соответствует либо SUT_INST_EXAMPLES ИЛИ SUT_INST_PING в начале строки


Альтернативный gawk (GNU awk) подход:

gawk -i inplace -F'=' -v OFS='=' '$1~/^SUT_INST_(EXAMPLES|PING)/{$2=($2=="false")? "true":"false"}1' file
7
27.01.2020, 21:18

sed позволяет вам выполнять несколько операций в каждой строке:

sed -e '...' -e '...' file

Таким образом, вы можете по крайней мере объединить два ваших вызова sed в один с помощью

sed -i -e 's/^SUT_INST_EXAMPLES=false/SUT_INST_EXAMPLES=true/' \
       -e 's/^SUT_INST_PING=false/SUT_INST_PING=true/' file

To параметризовать замену, использовать переменные:

examples="true"
ping="false"

sed -i -e "s/^SUT_INST_EXAMPLES=.*\$/SUT_INST_EXAMPLES=$examples/" \
       -e "s/^SUT_INST_PING=.*\$/SUT_INST_PING=$ping/" file

Вышеприведенное безоговорочно установит значения SUT_INST_EXAMPLES и SUT_INST_EXAMPLES на значения $examples и $ping соответственно.

3
27.01.2020, 21:18

Вы можете просто переключиться с помощью:

sed -i -E '/^SUT_INST_(PING|EXAMPLES)=/{s/false/true/;t;s/true/false/;}' infile

Это изменит true на false или false на true в зависимости от текущего значения.

3
27.01.2020, 21:18

Теги

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