sed
我在尝试在配置文件中进行搜索和替换时遇到了一些麻烦。
我想使用多个命令并使用-e
选项来执行以下操作。
DBName=.*
步骤 1:找到文件中行首处第一次出现的并替换为DBName=localhost
- 如果
DBName=.*
不存在- 步骤 2:找到
# DBNAME=.*
文件中行首处第一次出现的 ,并在字符串下方插入一行DBName=localhost
- 步骤 2:找到
- 如果
# 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
设置一个名为 的标签a
,n
读取模式空间中的下一行并打印它。ba
回到标签a
。这一切都会导致sed
打印所有剩余的行不受影响。此时sed
命令退出q
,其他表达式将不会被处理。所以更换只需进行一次。 - 这第二表达式搜索以 开头的行
# DBName=.*
,如果找到则a
添加DBName=localhost
到下一行。请注意,命令中的换行符是必需的,因为a
命令后面不得有任何内容。添加完成后,:a;n;ba;q
与第一个表达式中的操作相同。如果不... - ...这第三表达式被处理。它使用命令字符串将字符串添加到文件 (
$
)的最后一行。a
DBName=localhost
答案2
sed -i 's/DBName=.\*/DBName=localhost/g' -e 's/\# DBNAME=.*/DBName=localhost/g' config_file
它将满足您的前两个条件