Попытка изменить атрибут «data_directory» в файле postgresql.conf с помощью команды awk, но продолжает получать синтаксическую ошибку - PullRequest
0 голосов
/ 28 ноября 2018

Мне нужно изменить атрибут data_directory в файле postgresql.conf навсегда.Я попытался сделать это, используя команду awk , как показано ниже.(Я прокомментировал существующий атрибут, чтобы освободить место для новой записи ниже.)

sudo awk '/data_directory = '/var/lib/postgresql/10/main'/ { print; print "data_directory = 'someDir/postgresql/10/main'"; next }1' /home/ubuntu/postgresql.conf

Но я получаю синтаксическую ошибку прямо под первым print , как показано ниже.

awk: cmd. line:1: /data_directory = /var/lib/postgresql/10/main/ { print; print "data_directory = AquilaData/postgresql/10/main"; next }1
awk: cmd. line:1:                                                ^ syntax error

Не могу понять, почему.Любая помощь приветствуется.Спасибо.

Редактировать: мне нужно сохранить одинарные кавычки вокруг пути к каталогу.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

/ используется для заключения теста с регулярным выражением, но / char находится в пути /var/lib/postgresql/10/main, поэтому это вызывает синтаксическую ошибку.

Либо попытайтесь определитьпеременная line в BEGIN, которая выполняется только один раз перед фактическим анализом файла:

sudo awk 'BEGIN { line="data_directory = '/var/lib/postgresql/10/main'" } ; $0 ~ line { ....

Или экранируйте / в пути, используемом в регулярном выражении:

udo awk '/data_directory = '[/]var[/]lib[/]postgresql[/]10[/]main'/ { ...
0 голосов
/ 29 ноября 2018

Здесь нужно позаботиться о двух проблемах: 1. Одиночная кавычка, 2. что '/' в пути.

Я определил образец test.conf, как показано ниже, / var / lib будет замененс / sample внутри одинарных кавычек.

$ cat test.conf
data_directory = '/var/lib/postgresql/10/main'

Затем определены две переменные

$ SRC="data_directory = '/var/lib/postgresql/10/main'"
$ DST="data_directory = '/sample/postgresql/10/main'"

Однострочная команда sed выполняет свою работу.Я использовал '+' в качестве разделителя и двойную кавычку для sed.

$ sed -i "s+$SRC+$DST+g" test.conf

См. Результат.

$ cat test.conf
data_directory = '/sample/postgresql/10/main'
0 голосов
/ 28 ноября 2018
/data_directory = /var/lib/postgresql/10/main/

Команда фильтра работает как /string/.В строке, которую вы хотите отфильтровать, есть несколько / символов - вам нужно их экранировать.Попробуйте:

/data_directory = \/var\/lib\/postgresql\/10\/main/

\/ сообщает awk, что это / не является концом команды фильтра, но является частью строки для фильтрации.

sudo awk '/data_directory = \/var\/lib\/postgresql\/10\/main/ { print "data_directory = someDir/postgresql/10/main"; next }1' /home/ubuntu/postgresql.conf

Однако я бы, вероятно, согласился с:

awk -v VAR="someDir/postgresql/10/main" '/^data_directory = /{ print "data_directory = ",VAR; next; }1'

Пример можно найти на tutorialspoint .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...