今天有一个需求是对文本中的字符串进行批量替换,其中需要用到正则表达式匹配指定模式。但就是这个正则让我踩了很多坑,特此记录。
linux下的批量文本替换方法百度一抓一大把,无非是sed结合grep,就是下面的指令:
sed -i "s/原字符串/新字符串/g" 'grep -rl 原字符串 搜索根目录'
其中,sed实现字符串替换的基本用法是:
sed -i "s/原字符串/新字符串/g" 文件名
而grep -rl指令可以在给定的根目录搜索给定字符串并返回所有包含指定字符串的文件名。
但是实践中遇到这样的问题,对于一个普通的字符串比如“abcd”只需要grep -rl abcd 即可实现在当前目录下搜索所有包含abcd字符的文件并列出,但是对于有特殊符号的字符串比如“(abcd”,“ab cd”,或者需要用到正则表达式“ab.*cd”,sed就会报错:
sed -i "s/(ab.*cd)/abcd/g" 'grep -rl "(ab.*cd)"'
ERROR:
sed: 无法读取 grep -rl "(ab.*cd)": 没有那个文件或目录
查了很多资料,最后用到xargs,通过以下指令成功实现:
grep -rl "(ab.*cd)" | xargs sed -i "s/(ab.*cd)/abcd/g"
简单讲解一下,grep -rl "(ab.*cd)"给出了文件名单,通过管道“|”传递给xargs。
xargs 为之后的sed指令提供grep列出的文件名。