尝试使用awk命令更改postgresql.conf文件中的'data_directory'属性,但继续收到语法错误

时间:2018-11-28 08:49:07

标签: shell awk

我需要永久更改postgresql.conf文件中的'data_directory'属性。我尝试使用 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 :(得分:1)

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

filter命令用作/string/。您要过滤的字符串中有多个/字符-您需要对其进行转义。试试:

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

\/告诉awk,这个/并不是filter命令的结尾,但是它是要过滤的字符串的一部分。

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上找到示例。

答案 1 :(得分:1)

/用于用正则表达式将测试括起来,但是在路径名/中发现/var/lib/postgresql/10/main char,这就是导致语法错误的原因。

尝试在line中定义变量BEGIN,该变量在实际解析文件之前仅执行一次:

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

或在正则表达式中使用的路径名中转义/

udo awk '/data_directory = '[/]var[/]lib[/]postgresql[/]10[/]main'/ { ...

答案 2 :(得分:1)

这里要注意两个问题-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'