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'

posted on 2024-06-20 10:12  疯狂的妞妞  阅读(1)  评论(0编辑  收藏  举报

导航