在 sed 中使用多个命令在带有特殊字符的字符串后插入文本

在 sed 中使用多个命令在带有特殊字符的字符串后插入文本

sed我在尝试在配置文件中进行搜索和替换时遇到了一些麻烦。

我想使用多个命令并使用-e选项来执行以下操作。

  • DBName=.*步骤 1:找到文件中行首处第一次出现的并替换为DBName=localhost
  • 如果DBName=.*不存在
    • 步骤 2:找到# DBNAME=.*文件中行首处第一次出现的 ,并在字符串下方插入一行DBName=localhost
  • 如果# DBNAME=.*不存在
    • 第三步:DBName=localhost在文件底部插入

第一次出现的语法让我很困惑。另外,#字符串中后面跟着的“空格”# DBNAME=也让我很困惑。

答案1

用这个:

sed -e '/^DBName=.*/{s/^DBName=.*/DBName=localhost/;:a;n;ba;q}' \
  -e '/^# DBName=.*/{a \DBName=localhost
  :a;n;ba;q}' -e '$a \DBName=localhost' file

在哪里:

  • 第一的 -e语句搜索^DBName=.*^意味着从行的开头),如果找到,则{}执行括号中的部分:这将搜索并替换字符串,完成后,:a设置一个名为 的标签an读取模式空间中的下一行并打印它。ba回到标签a。这一切都会导致sed打印所有剩余的行不受影响。此时sed命令退出q,其他表达式将不会被处理。所以更换只需进行一次。
  • 第二表达式搜索以 开头的行# DBName=.*,如果找到则a添加DBName=localhost到下一行。请注意,命令中的换行符是必需的,因为a命令后面不得有任何内容。添加完成后,:a;n;ba;q与第一个表达式中的操作相同。如果不...
  • ...这第三表达式被处理。它使用命令字符串将字符串添加到文件 ( $)的最后一行。aDBName=localhost

答案2

sed -i 's/DBName=.\*/DBName=localhost/g' -e 's/\# DBNAME=.*/DBName=localhost/g' config_file

它将满足您的前两个条件

相关内容