linux - 字符串替换
使用场景:部署项目的时候,需要统一修改 IP 地址等内容。
缺点:这些命令,都缺少必要的校验功能,容易因为操作失误,会出现 未替换,或者替换成空串 的情况。
比如说:写了好多行的 sed命令,不小心删了一行代码,这种情况下,执行代码不会报错,因此很容易埋下安全隐患。
推荐:要进行很复杂的替换时,还是尽量通过业务代码进行控制。
sed 命令
效果类似于 windows 环境下的文本替换,将文件中所有旧的字符替换成新的字符。
# 将文件 file.txt 中的所有 hello 替换为 world
sed -i 's/hello/world/g' file.txt
# 将文件 file.txt 中的所有 hello 替换为变量 val
val=a;sed -i "s/hello/${val}/g" file.txt
# val 中存在 '/' 字符的情况,语句会报错;
val=a/;sed -i "s/hello/${val}/g" file.txt
# 这时候,将命令中的 '/' 替换为 '#' 即可;
# 很明显,这也导致另一个问题,val 中不能存在 '#'。
val=a/;sed -i "s#hello#${val}#g" file.txt
# sed 命令并不是专业的字符替换工具,能用但是不好用,很容易因为特殊字符导致出错。
我们可以写一个脚本,解决 sed 命令转义问题
# 新建一个 shell 脚本,输入下列内容
#!/bin/bash
src=$1:
tar-$2
file=$3;
b='/';
c='\/';
src=${src//$b/$c};
tar=${tar//$b/$c};
sed -i "s/${src}/${tar}/g" $file;
# 脚本的使用方式,将字符串 'a' 替换为 '/a'
./replace.sh 'a' '/a' test.txt
awk 命令
用新的字符替换旧的字符,并且生成一份新的文件。
awk 更复杂一些,同时也有更高级的应用,就像短信模版一样,预先做一些占位符,等到使用的时候,填充具体的参数值,方便程序进一步调用。
# 定义两个变量
old_string="原始值";new_string="新的值";
# 用新的值替换旧的值,并生成一份新的文件
awk -v old=$old_string -v new=$new_string '{gsub(old, new)}1' input.txt > output.txt
# 替换多个字符串
awk '{gsub("World", "Universe"); gsub("Hello", "Hi")}1'
疯狂的妞妞 :每一天,做什么都好,不要什么都不做!