Использование команды sed для соответствия текста в определенном блоке текста

У меня есть следующий текст:

client_encryption_options: enabled: true # If enabled and optional is set to true encrypted and unencrypted connections are handled. optional: false keystore: conf/.keystore keystore_password: cassandra 

Я пытаюсь изменить значение в хранилище ключей под client_encryption_options, используя команду sed.

 sed "/^client_encryption_options:/,+1s/keystore:.*/keystore: \/opt\/test/" $CASSANDRA_YAML_FILE > cassandra.yaml.tmp && mv cassandra.yaml.tmp $CASSANDRA_YAML_FILE 

Когда я пытаюсь выполнить вышеуказанную команду, он не заменяет conf / .keystore на /opt/test/

Нет, нет.

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

Изменение +1 до +4 может исправить это для вас.

 sed -e ' /^client_encryption_options:/,/keystore:/!b //!b s|\(keystore:\).*|\1 /opt/test| ' < $CASSANDRA_YAML_FILE > cassandra.yaml.tmp && \ mv cassandra.yaml.tmp "$CASSANDRA_YAML_FILE" 

Вы даже можете использовать параметр «-i» (inplace edit), если ваш «sed» поддерживает его, чтобы покончить с «mv»:

 sed -i.BAK -e 'your edit commands here' $_YOUR_YAML_FILE # Note: NO redirections here