shell脚本文本替换

1 篇文章 0 订阅
1 篇文章 0 订阅

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 复杂替换

为了解决字符串包含特殊字符,目前思路:

  1. 找到字符串所在行号
  2. 删除整行字符
  3. 新增替换文本
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}"
  • 4
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值