У меня есть файл .conf в формате ключ/значение. Но могут быть и неуникальные ключи. Различие между ними, как показано ниже:

###
### [meta]
###
### Controls the parameters for the Raft consensus group that stores metadata
### about the InfluxDB cluster.
###

[meta]
  # Where the metadata/raft database is stored
  dir = "/var/lib/influxdb/meta"

 # Automatically create a default retention policy when creating a 
database.
  # retention-autocreate = true

  # If log messages are printed for the meta service
  # logging-enabled = true

###
### [data]
###
### Controls where the actual shard data for InfluxDB lives and how it is
### flushed from the WAL. "dir" may need to be changed to a suitable         place
### for your system, but the WAL settings are an advanced configuration. The
### defaults should work for most systems.
###

[data]
  # The directory where the TSM storage engine stores TSM files.
  dir = "/var/lib/influxdb/data"

  # The directory where the TSM storage engine stores WAL files.
  wal-dir = "/var/lib/influxdb/wal"

Чего я хочу добиться, так это написать скрипт в Fedora для изменения значения ключа dir в блоке data. Я видел здесь аналогичный скрипт для уникальных ключей (https://stackoverflow.com/questions /2464760/modify-config-file-using-bash-script). Но это не работает для меня, к сожалению. Как я могу это сделать?

1
Jeff Schaller 6 Дек 2019 в 17:42

1 ответ

Лучший ответ

Предполагая, что ваше имя файла — foo.conf, и вы хотите изменить значение каталога на «/dev/sdh», приведенный ниже код заменит ключевое слово dir только для раздела данных.

sed -re '/^\[data\]$/,/^\[/ s/^(\s+)*(dir = .*)$/\1dir = "\/dev\/sdh"/' foo.conf
/^\[data\]$/,/^\[/

Эта часть заставляет sed работать только с разделом «данные». Вы можете заменить «данные» на любое ключевое слово, чтобы оно работало для любого раздела.

1
ibrahim 9 Дек 2019 в 13:23
Вывод команды sudo sed -i -e '/^\[data\]$/,/^\[/ s/^dir = .*$/dir = "/dev/sdh"/' /etc/influxdb/influxdb.conf: sed: -e expression #1, char 41: unknown option to s'. Этот sudo sed -i -e '/^\[data\]$/,/^\[/ s/^dir = .*$/dir = "new_value"/' /etc/influxdb/influxdb.conf не производит никакого вывода, но и содержимое файла не изменяется.
 – 
JollyRoger
6 Дек 2019 в 15:36
Вы должны сбежать /. Попробуйте это sudo sed -i -e '/^[data]$/,/^[/ s/^dir.*$/dir = "\/dev\/sdh"/' /etc/influxdb/influxdb.conf
 – 
ibrahim
6 Дек 2019 в 15:41
Эй, я изменил содержимое файла так, как я написал выше, и это сработало. Но на самом деле есть некоторые строки комментариев, начинающиеся с # или некоторых других ключей. Я думаю, это может привести к тому, что их нельзя будет изменить. Как я могу убежать от них? Сейчас я обновляю образец файла в своем ответе.
 – 
JollyRoger
6 Дек 2019 в 15:51
Это потому, что конечный пробел. Я обновлю свой ответ, чтобы работать в любом случае.
 – 
ibrahim
6 Дек 2019 в 15:54
Большое вам спасибо за ваш ответ!
 – 
JollyRoger
6 Дек 2019 в 16:35