我需要永久更改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
不知道为什么。任何帮助表示赞赏。谢谢。
编辑:我需要保留目录路径周围的单引号。
答案 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'