shell脚本文本替换
目前针对unix进行处理,linux欠缺一些
一、Linux
s 开始
/g 结束
sed -i 's/目标字符串/替换字符串/g' 目标文件
二、Unix
2. 1 简单替换
ps: sed在unix使用不怎么友好,改成用perl
这种方式只能简单的字符,包含特殊字符就不行了!
# 字符串不包含/
perl -pi -e "s/目标字符串/替换字符串/g" 目标文件
# 字符串包含/ 则改成#
perl -pi -e "s#目标字符串/替换字符串/g" 目标文件
完整示例
#!/bin/bash
fileName=$1
keyword=$2
replaceContent=$3
echo "target file: ${fileName}"
echo "keyword: ${keyword}"
echo "replace content: ${replaceContent}"
echo "start search & replace"
echo "perl -pi -e 's#${keyword}#${replaceContent}#g' ${fileName}"
perl -pi -e "s#${keyword}#${replaceContent}#g" ${fileName}
echo "end."
2. 2 复杂替换
为了解决字符串包含特殊字符,目前思路:
- 找到字符串所在行号
- 删除整行字符
- 新增替换文本
2.2.1 获取字符串所在行号
1)通过grep管道获取行号
awk用于截取结果,grep返回结果格式【目标字符串:行号】
grep -n "目标字符串" 目标文件 | awk -F ":" '{print $1}'
示例: grep -n "aaaa" test.txt | awk -F ":" '{print $1}'
结果:67
2)通过sed获取行号
sed -n "aaaa" test.txt
2.2.2 删除字符串所在行
1)通过sed 删除
sed "67d" test.txt
2)通过perl删除
$.表示当前行
perl -ni -e "print unless $. == 67" test.txt
2.2.3 在原字符串所在行新增替换字符串
1)通过sed新增
sed新增在脚本里面执行不成功,但手工执行可以,我也不知道 Qrz
sed "67c replaceString" test.txt
2)通过perl新增
perl -pi -e "print 'replaceString' if $. == 67" test.txt
完整shell脚本
shell脚本的变量必须在""号内才能识别
#!/bin/bash
fileName=$1
keyword=$2
replaceContent=$3
echo "target file:${fileName}"
echo "keyword:${keyword}"
echo "replace content:${replaceContent}"
echo "find target line." echo "grep -n \"${keyword}\" ${fileName} | awk -F \":\" '{print $1}'"
target_line=`grep -n "${keyword}" ${fileName} | awk -F ":" '{print $1}'`
echo "line is ${target_line}"
echo "remove line ${target_line} ."
echo "perl -ni -e \"print unless $. == ${target_line}\" ${fileName}"
perl -ni -e "print unless $. == ${target_line}" ${fileName}
echo "remove done."
echo "append begin ."
echo "perl -pi -e \"print '${replaceContent}' if $. == ${target_line}\" ${fileName}"
perl -pi -e "print '${replaceContent}' if $. == ${target_line}" ${fileName}
perl -pi -e "print '' if $. == ${target_line}" ${fileName}
echo "append end." echo "replace done."
2.2.4 如果替换字符串贼长
单独新建一个shell
PS : 对变量加""号执行,这样里面对空格就不会被分开当成参数
text="aaaaaa好长的字符串啊 还带空格的, 坑爹啊 "
sh replace.sh test.txt aaaa "${text}"