Необходимо заменить определенную часть строки из файла с помощью сценария оболочки - PullRequest
0 голосов
/ 17 декабря 2018

Я пытаюсь заменить часть path строки ниже из postgresql.conf, используя скрипт оболочки:

data_directory = '/var/lib/postgresql/10/main'      # use data in another directory

Сначала я проверил, могу ли я сначала найти строку, используя скрипт ниже, но он не нашел строку:

#!/bin/bash
while IFS='' read -r line || [[ -n "$line" ]]; do
        if [[ "$line" = "data_directory = '/var/lib/postgresql/10/main'         # use data in another directory" ]]

Я знаю, что есть лучший способ заменить эту строку, используя sed, но мне нужно знать, выполнимо ли это, читая файл от начала до конца изатем замените нужную часть линии, если она найдена.Если нет, то замена всей строки только измененной частью path также сделает это.Спасибо!

Ответы [ 3 ]

0 голосов
/ 17 декабря 2018

Простой раствор для решения проблем:

path="/newpath"
while IFS= read -r -d $'\n'; do
  if [[ "${REPLY}" == "data_directory = '/var/lib/postgresql/10/main'      # use data in another directory" ]]
  then echo "${REPLY/\'*\'/'${path}'}"
  else echo "${REPLY}"
  fi
done < postgresql.conf > new.conf

mv new.conf postgresql.conf

Тест:

$ cat postgresql.conf
# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB
data_directory = '/var/lib/postgresql/10/main'      # use data in another directory
# This is a comment

$ path="/newpath"
$ while IFS= read -r -d $'\n'; do
>   if [[ "${REPLY}" == "data_directory = '/var/lib/postgresql/10/main'      # use data in another directory" ]]
>   then echo "${REPLY/\'*\'/'${path}'}"
>   else echo "${REPLY}"
>   fi
> done < postgresql.conf

# This is a comment
log_connections = yes
log_destination = 'syslog'
search_path = '"$user", public'
shared_buffers = 128MB
data_directory = '/newpath'      # use data in another directory
# This is a comment
0 голосов
/ 17 декабря 2018

Другой подход, использующий case - *, допускает неточный интервал вокруг равных и перед любым комментарием, но вводит небольшую вероятность ложных совпадений.Я думаю, что с остальной конкретной информацией в строке она достаточно мала, чтобы это не было проблемой.

$: cat postgresql.conf
some stuff
data_directory = '/var/lib/postgresql/10/main'         # use data in another directory
some other stuff.

$: path=/new/path/to/
$: while IFS='' read -r line || [[ -n "$line" ]]
>  do case "$line" in
>     data_directory*=*'/var/lib/postgresql/10/main'*) 
>        echo "${line//\/*\//$path}";;
>     *) echo "$line";;
>     esac
>  done < postgresql.conf >/tmp/checkme
some stuff
data_directory = '/new/path/to/main'         # use data in another directory
some other stuff.

Если это хорошо, то

mv /tmp/checkme postgresql.conf

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

0 голосов
/ 17 декабря 2018
REPLACEMENT_PATH=mypath
sed -i path/postgresql.conf -re "s/^(data_directory[[:space:]]*=[[:space:]]*')[^']*(')/\1${REPLACEMENT_PATH}\2/"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...