Manjaro/Arch :синхронизируют установленные пакеты на нескольких машинах

Внутри регулярного выражения вашей s команды вам нужно превратить каждую новую строку вашей строки в \n. То есть вот так:

s/my\n\nstrin\n\ngtodel\n\nete\n//g

Обратите особое внимание на последний \n, должен ли он быть частью вашего паттерна или нет.

Затем также имейте в виду, что sedявляется инструментом, ориентированным на строку -, что означает, что по умолчанию он применяет команды к каждой входной строке по очереди и к каждой новой строке (разрыву строки. ), присутствующий на его входе, квалифицируется как одна единственная «строка ввода».

Поэтому, если вам нужно сопоставить шаблон, содержащий переводы строк, вы должны явно указать sedоб этом.

Одним из вариантов является использование параметра -z, чтобы заставить его использовать символы NUL (двоичные 0x00 )в качестве разделителя строки -, но это невозможно сделать, если ваши входные данные также содержит NUL.

Если ваш ввод не содержит NUL (и ваш sedна самом деле имеет параметр -z), вы можете просто использовать команду sвыше с sed -zи все готово.

Альтернатива, которая может работать с любым вводом, состоит в том, чтобы sed добавлять строки в так называемое -«пространство хранения», а затем применять шаблон к этому в -области памяти.

Если вы можете сузить свой ввод, к которому применяется замена, используя адреса sed, это может быть лучше, потому что некоторые реализации sedимеют ограниченное пространство для хранения -. В противном случае вам нужно прочитать весь ввод и надеяться, что он впишется в эту область. Однако,Например, GNU sedне имеет ограничений, поэтому, если вы используете обычную систему Linux, у вас все будет в порядке.

Предполагая, что ваш ввод не может быть сужен (, т. е. ваша строка может появиться в любом месте вашего ввода ), одна sedкоманда для вас может быть:

cat input_file | sed -ne '1h;1!H;${x;s/my\n\nstrin\n\ngtodel\n\nete\n//g;p}'

Разбор команды sedдля объяснения:

1h;     # *copy* first line to hold-space
1!H;    # *append* all non-first lines (i.e. all lines after the first) to hold-space
${x;    # at the end of input move hold-space into regular pattern-space
  s/my\n\nstrin\n\ngtodel\n\nete\n//g;  # then apply substitution
  p}    # and print the resulting text
0
20.02.2020, 18:15
1 ответ

Этот ответ является запросом от OP (см. комментарии к вопросу OP для получения подробной информации )для сценария, который собирает установленные пакеты.

Имейте в виду, что приведенный ниже сценарий предназначен для RHEL (Red Hat Enterprise Linux ), если вы используете другую систему, вы все равно можете использовать его, обновив определенные команды диспетчера пакетов, чтобы они соответствовали вашей системе.

#!/bin/bash
# VARS
# declare the hostnames of your servers. it requires to have a config file inside./ssh with the connection information.
HOSTS=" prd_webserver1 prd_webserver2 prd_db1 prd_db2 prd_frontend1 prd_frontend2"
# create a store directory on the path were the script is
store="artifact_store"
# declare roles based on hostname
role_store="webserver db frontend"

# Create artifact_store directory
[ ! -d "$store" ] && mkdir -p "$store"

# Create role store directories
for ROLE_DIR in ${role_store}; do
[ ! -d "$store/${ROLE_DIR}" ] && mkdir -p "$store/${ROLE_DIR}"
done

CMDS=$(cat <<CMD
 bash -c "sudo yum -q check-update --security --exclude=kernel* |awk '{print $ 1}' > /tmp/updatelist.log"
CMD
)

# Create update lists
for HOSTNAME in ${HOSTS}; do
ssh -t ${HOSTNAME} "$CMDS"
scp ${HOSTNAME}:/tmp/updatelist.log./updatelist_${HOSTNAME}.log
mv updatelist_${HOSTNAME}.log $store
done

# Create role directories and move artifacts
for ROLE in ${role_store}; do
mv $store/*${ROLE}*.log $store/${ROLE}
cat $store/${ROLE}/updatelist_*.log >> $store/${ROLE}/updatelist.combined
cat $store/${ROLE}/updatelist.combined |sort |uniq >> $store/${ROLE}/updatelist.final
rm $store/${ROLE}/updatelist.combined
done
1
28.04.2021, 23:22

Теги

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