linux 批量查找与替换
批量查找指定字符并替换。
1、sed与grep配合
格式: sed -i “s/查找字段/替换字段/g” `grep 查找字段 -rl 路径`
或者 grep -rl 查找字段 路径|xargs sed -i “s/查找字段/替换字段/g”
grep -r 指定目录递归查找
实例:
sed -i “s/oldstring/newstring/g” `grep oldstring -rl yourdir`
sed -i “s/www.admin99.net/admin99.net/g” `grep www.admin99.net -rl /home` #替换/home下所有文件中的www.admin99.net为admin99.net
exp:sed -i “s/shabi/$/g” `grep shabi -rl ./`
或者
grep -rl matchstring somedir/ | xargs sed -i \’s/string1/string2/g\’
grep -rl \’windows\’ ./path | xargs sed -i \’s/windows/linux/g\’
sed -i \’s/old-word/new-word/g\’ *.txt
sed \’s/old/new/g\’ input.txt > output.txt
将文件1.txt内的文字“garden”替换成“mirGarden”
# sed -i “s/garden/mirGarden/g” 1.txt //sed -i 很简单
将当前目录下的所有文件内的“garden”替换成“mirGarden”
## sed -i “s/garden/mirGarden/g” `ls` //其实也就是ls出多个文件名而已
#!/bin/bash OLD="xyz" NEW="abc" DPATH="/home/you/foo/*.txt" BPATH="/home/you/bakup/foo" TFILE="/tmp/out.tmp.$$" [ ! -d $BPATH ] && mkdir -p $BPATH || : for f in $DPATH do if [ -f $f -a -r $f ]; then /bin/cp -f $f $BPATH sed "s/$OLD/$NEW/g" "$f" > $TFILE && mv $TFILE "$f" else echo "Error: Cannot read $f" fi done /bin/rm $TFILE
2、find
命令格式:find -name \’要查找的文件名\’ | xargs perl -pi -e \’s|被替换的字符串|替换后的字符串|g\’
这里使用了perl语言,使用-e加上一段代码,从而批量地将当前目录及所有子目录下的file.log文件中的string1替换成了string2; string支持正则表达式
#查找替换当前目录下包含字符串并进行替换
find -name \’*.txt\’ | xargs perl -pi -e \’s|智慧乡村|北部山区|g\’
#递归查找替换
find . -type f -name \’*.html\’ | xargs perl -pi -e \’s|智慧乡村|北部山区|g\’
3. awk
grep -i “windows” -r ./path | awk -F : \'{print $1}\’ | sort | uniq | xargs sed -i \’s/windows/linux/g\’
这里使用了shell命令,先查找出文件,再用awk分割(以:切分),再行替换!
linux下查找某目录下所有文件包含某字符串的命令
参考资料:
http://www.cyberciti.biz/faq/unix-linux-replace-string-words-in-many-files/