sed:`s'的未知选项


1

我试图通过使用bash脚本来更改配置文件。我使用sed命令更改如下。

VAR1=$(cat postgresql.conf | grep "shared_buffers =" | cut -d# -f1)
VAR2=$(shared_buffers = 8GB)
sed -ie s/${VAR1}/${VAR2}/g postgresql.conf 

我尝试过,但是给了我错误。

sed:-e表达式#1,字符29:`s'的未知选项

什么东西少了?


请尝试使用引号:sed -ie "s/${VAR1}/${VAR2}/g" postgresql.conf
Marco Marco

您要达到什么目的,而无法通过更简单的替代方法(例如sed -e '/shared_buffers /s/=[^#]*/= 8GB /'或类似方法)解决呢?
Toby Speight,

跟踪脚本bash -x应该表明您做错了什么。
Toby Speight,

sed -ie“ s / $ {VAR1} / $ {VAR2} / \ t / g” postgresql.conf 我如上所述使用sed命令,它可以工作,但是,我更改的那个变成了 shared_buffers = 8GB#min 128kB 如何我在上面添加了标签吗?@TobySpeight-
李李

使用更简单的命令更新了答案-保留了现有空白。
Toby Speight

Answers:


4

通常的原因是其中一个(或两个)变量都包含定界符(在您的情况下/)。您可以

  • 如果您有一个不会出现的替代字符,请更改定界符:

    sed -e "s#${VAR1}#${VAR2}#g"

    要么

  • 替换变量中的定界符:

    sed -e "s/${VAR1//\//\\/}/${VAR2//\//\\/}/g"

$VAR1如果您希望将其作为文字进行匹配,则可能还需要进行其他替换,因为s///通常会使用正则表达式。


但是,查看显示给我们的东西之后,您似乎真正想做的就是shared_buffers将配置文件中分配的值更改为固定值8GB,在这种情况下,不需要任何变量:

sed -i -e '/^shared_buffers[ \t]/s/=[ \t]*[^# \t]\+/= 8GB/' /postgresql.conf

您可以像在以开头的每行shared_buffers和一个水平空间中那样阅读,然后用替换第一行=和其后的单词= 8GB,这似乎是您想要的。


它通过使用'sed -ie“ s / $ {VAR1} / $ {VAR2} / g” postgresql.conf'来工作,无论如何,它结合了我
Lee
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.