歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux基礎 >> 關於Linux

Linux在所有文件中查找和替換

經常會碰到這樣的情況:查找某個目錄下所有包含某個字符串的所有文件,並將這些文件中的這個字符串用另外的字符串替換進行替換。這種情況下,網網要檢查的文件比較多,逐一進行檢查替換太麻煩,這個時候,我們就應該找一個能夠一條命令解決問題的方法。

1、grep命令

grep pattern file.txt命令默認的行為是將file.txt文件中,匹配pattern的行輸出到標准輸出。這個功能能幫助我們在文件中查找一個字符串出現的上下文,但是並不能夠幫助我們實現下一步復雜的操作,所以有必要稍微了解下grep的一些選項。

現在測試文件的內容如下:

$ cat target.txt 
 <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
text-decoration: none;" href="http://www.asdf.net/scholar/xindong_wu.html">Xindong
" href="http://asdf.net/scholar/Federi

 <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>

 href="http://www.asdf.net/scholar/Gong-Qing_Wu.html">

href="http://asdf.net/scholar/Federico_Bocardi.html">Federico occardi</a></li><span class="Apple-converted-space"> </span><li style="display: inline-block; padding-right: 5px; padding-left: 5px;"><a style="color: rgb(66, 139
為了測試我們將這個文件,另外拷貝出兩份,重命名然後放在如下的目錄結構中: 
$ tree .
.
├── a
│   └── target1.txt
├── target2.txt
└── target.txt

執行grep命令:

$ grep -rn "http://yyy.xxx.edu.cn" *              
a/target1.txt:1:<a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
a/target1.txt:5: <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target2.txt:1:<a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target2.txt:5: <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target.txt:1:<a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
target.txt:5: <a class="navbar-brand" href="http://yyy.xxx.edu.cn/">Panda Search</a>
grep提供下面的選項:
*就是一般的bash通配符,表示當前目錄所有文件,當然,你也可以寫某個文件名
-r 是遞歸查找,意思就是也查找當前目錄的子目錄中的文件
-n 是顯示行號
-i 忽略大小寫
-l 列出匹配的文件名
-L 列出不匹配的文件名
-w 只匹配整個單詞,而不是字符串的一部分(如只匹配‘man’,包括man兩邊有符號的如‘.man.’,或者是‘=man=’而不包括‘ woman ’或者是‘ manly ’)

2、Linux其他預備技能 2.1 將命令輸出作為參數方式有好多種,這裡列出兩種:``和$(),下面是一個例子。

$ echo `ls`
a target2.txt target.txt t.tt
$ echo $(ls)
a target2.txt target.txt t.tt
2.2 文件替換sed sed命令的使用參見前面的文章,這裡只說用到的地方:
sed -i "s/old/new/g" file1.txt file2.txt 可以將file*.txt中的所有old換成new。如果new什麼都沒有,就是表示刪除old的意思。
3、將上面的技能串起來這樣,只需幾行,就能夠完成所有文件中,指定幾種字符串的替換了。當然,也要注意下,sed命令的使用中,當有'/'字符的時候要注意轉義,具體如下:
$ sed -i "s/http:\/\/yyy.xxx.edu.cn//g" $(grep -lr "http://yyy.xxx.edu.cn" *)
$ cat target.txt 
<a class="navbar-brand" href="/">Panda Search</a>
text-decoration: none;" href="http://www.asdf.net/scholar/xindong_wu.html">Xindong
" href="http://asdf.net/scholar/Federi

 <a class="navbar-brand" href="/">Panda Search</a>

 href="http://www.asdf.net/scholar/Gong-Qing_Wu.html">

href="http://asdf.net/scholar/Federico_Bocardi.html">Federico occardi</a></li><span class="Apple-converted-space"> </span><li style="display: inline-block; padding-right: 5px; padding-left: 5px;"><a style="color: rgb(66, 139
$ sed -i "s/http:\/\/www.asdf.net//g" $(grep -lr "http://www.asdf.net" *)
$ sed -i "s/http:\/\/asdf.net//g" $(grep -lr "http://asdf.net" *)        
$ cat target.txt 
<a class="navbar-brand" href="/">Panda Search</a>
text-decoration: none;" href="/scholar/xindong_wu.html">Xindong
" href="/scholar/Federi

 <a class="navbar-brand" href="/">Panda Search</a>

 href="/scholar/Gong-Qing_Wu.html">

href="/scholar/Federico_Bocardi.html">Federico occardi</a></li><span class="Apple-converted-space"> </span><li style="display: inline-block; padding-right: 5px; padding-left: 5px;"><a style="color: rgb(66, 139
$
看到這裡,或許你也明白我要做什麼了。其實,是這樣的,一位童鞋往我們線上的系統中加了幾個靜態網頁,網頁中用到的超鏈全部是直接從浏覽器復制過來的,包括站內的跳轉。這樣明顯不科學,盡管當時是沒毛病,但是現在我們的域名要換了,問題就來了,這些老域名的跳轉鏈接都不能訪問了。為了根治這個問題,我決定將這些站內跳轉的域名部分全部刪掉,就能夠實現正常的跳轉了。由於文件太多,只好用了上面的方法。
Copyright © Linux教程網 All Rights Reserved