1. 程式人生 > >批量替換多個文件裏邊的字符串

批量替換多個文件裏邊的字符串

批量替換多個文件裏邊的字符串 批量修改文件裏邊的字符串 批量修改多個文件裏的字符串 批量修改文件字符串

一、批量遞歸查找包含字符串的所有文件

grep 命令用於查找在文件裏符合條件的字符串

grep -rl "B" /root/ceshi/*  

參數解釋:
-r  遞歸查找
-l  列出匹配的文件名
-n 列出所在的行號
*   代表ceshi目錄下的所有文件
--include="*.text"  只查找後綴名是.text的文件
--exclude="*.sql"  查找除了後綴名是.sql的文件
示例一:
[root@ceshi ~]# grep -rl "B" /root/ceshi/* 
/root/ceshi/a
/root/ceshi/aaaa.sql
/root/ceshi/b
/root/ceshi/bb.bak
/root/ceshi/bb.io
/root/ceshi/catalog/catalog/a.r
/root/ceshi/catalog/bb.abc
/root/ceshi/e.ior
/root/ceshi/r.doc
示例二:
[root@ceshi ~]# grep -rl "B" --exclude="*.sql" /root/ceshi/* 
/root/ceshi/a
/root/ceshi/b
/root/ceshi/bb.bak
/root/ceshi/bb.io
/root/ceshi/catalog/catalog/a.r
/root/ceshi/catalog/bb.abc
/root/ceshi/e.ior
/root/ceshi/r.doc

二、批量替換文件的字符串

sed 命令用語批量操作文件中的字符串
    sed -i s/"a"/"A"/g aa.txt
    參數:
    -i  直接在文檔裏修改內容,而不打印到終端;如果不加i,默認並不會修改文件,只是將替換的內容打印到終端。
    s  表示替換命令
    g  表示替換每行的所有符合條件的字符串;如果不加g,默認只替換每行的第一個符合條件的字符串。
    aa.txt  要操作的文件名,也可以是 *  代表當前目錄下所有的文件
示例一:
[root@ceshi ~]# vi aa  
AAA
BBB

[root@ceshi ~]# sed s/"A"/"a"/g aa   
aaa
BBB
#  這裏並沒有修改文件的內容,只是打印到了終端

[root@ceshi ~]# cat aa
AAA
BBB
示例二:
[root@ceshi ~]# sed -i s/"A"/"a"/g aa
[root@ceshi ~]# cat aa
aaa
BBB
#  這裏修改文件的內容完成

三、xargs

xargs 命令是給其他命令傳遞參數的一個過濾器,也是組合多個命令的一個工具,它擅成長將標準輸入數據轉換成命令行參數。

echo "-lh" | xargs ls 
上邊命令相當於:xargs將"-lh" 傳遞給了ls作為參數,相當於執行ls -lh
[root@ceshi ~]# echo "-lh" | xargs ls 
total 445M
-rw-r--r--.  1 root root    8 Mar 28 11:13 aa
drwxr-xr-x.  3 root root  108 Mar 28 11:13 ceshi
-rw-r--r--.  1 root root  663 Jan 16 15:09 client.py
-rw-r--r--.  1 root root  254 Jan  8 15:36 Dockerfile
-rw-r--r--.  1 root root  28M Dec 14 01:46 elasticsearch-6.1.0.rpm
-rw-r--r--.  1 root root 339M Oct  5 23:44 jdk-9.0.1_linux-x64_bin.tar.gz
drwxr-xr-x. 17  501  501 4.0K Jan 16 15:02 Python-3.6.4
-rw-r--r--.  1 root root  22M Jan 16 14:39 Python-3.6.4.tgz
-rw-r--r--.  1 root root  58M Oct  5 23:44 serverjre-9.0.1_linux-x64_bin.tar.gz

實際上就等於ls -lh

[root@ceshi ~]# ls -lh 
total 445M
-rw-r--r--.  1 root root    8 Mar 28 11:13 aa
drwxr-xr-x.  3 root root  108 Mar 28 11:13 ceshi
-rw-r--r--.  1 root root  663 Jan 16 15:09 client.py
-rw-r--r--.  1 root root  254 Jan  8 15:36 Dockerfile
-rw-r--r--.  1 root root  28M Dec 14 01:46 elasticsearch-6.1.0.rpm
-rw-r--r--.  1 root root 339M Oct  5 23:44 jdk-9.0.1_linux-x64_bin.tar.gz
drwxr-xr-x. 17  501  501 4.0K Jan 16 15:02 Python-3.6.4
-rw-r--r--.  1 root root  22M Jan 16 14:39 Python-3.6.4.tgz
-rw-r--r--.  1 root root  58M Oct  5 23:44 serverjre-9.0.1_linux-x64_bin.tar.gz

四、grep+sed+xargs實現批量替換多個文件裏邊的字符串

查看舊的文件內容:
[root@ceshi ~]# more ceshi/a
aaaaaaaaaaaa
bbbbbbbbbbbb
aaaaaaaaaaaa
[root@ceshi ~]# more ceshi/bb.io
aaaaaaaaaaaa
bbbbbbbbbbbb
aaaaaaaaaaaa
[root@ceshi ~]# more ceshi/catalog/catalog/a.r 
aaaaaaaaaaaa
bbbbbbbbbbbb
aaaaaaaaaaaa

統計替換前的文件數量
[root@ceshi ~]# grep -rl "b" --exclude="*.sql" ceshi/* | wc -l
8
註:這裏運用--exclude是因為.sql是數據庫文件,不能隨便修改

運行修改命令,將文件內容中包含b的 都替換成B
[root@ceshi ~]# grep -rl "b" --exclude="*.sql" ceshi/* | xargs sed -i s/"b"/"B"/g 

替換後,查看文件內容,所有的ceshi目錄下的包含的b 都替換成了B
[root@ceshi ~]# more ceshi/a
aaaaaaaaaaaa
BBBBBBBBBBBB
aaaaaaaaaaaa
[root@ceshi ~]# more ceshi/bb.io 
aaaaaaaaaaaa
BBBBBBBBBBBB
aaaaaaaaaaaa
[root@ceshi ~]# more ceshi/catalog/catalog/a.r 
aaaaaaaaaaaa
BBBBBBBBBBBB
aaaaaaaaaaaa

統計替換後的文件數量:
[root@ceshi ~]# grep -rl "B" --exclude="*.sql" ceshi/* | wc -l    
8

修改完成。

批量替換多個文件裏邊的字符串