大量文字檔內容搜尋指令~~~ [論壇 - Ubuntu 程式設計]


正在瀏覽:   1 名遊客


 到底部   前一個主題   下一個主題  [無發表權] 請登錄或者註冊

(1) 2 »


大量文字檔內容搜尋指令~~~
版主
註冊日期:
2008/5/13 23:12
來自 Ciudad de Kaohsiung, Taiwán
等級: 15
HP : 0 / 369
MP : 94 / 11608
EXP: 76
離線
請教一下各位,最近由於工作上的需要,常常必須要在眾多的檔案之中,搜尋特定關鍵字的位置,例如說在網路資訊系統專案的原始碼堆裡,找尋出某個 CSS 定義於哪個一樣式表檔案中、某個程式路徑是在哪一個 XML 檔案中被定義... 等等,這些要搜尋的目標檔案都是文字內容的檔案,只不過有著不同的副檔名,也分散在很多龐雜的子目錄之中。針對這樣的情況,小生目前所使用的 NetBeans 並未支援這樣的功能,因此在想若要利用 Linux 底下的 Shell 指令來做的話,該要怎麼寫才行呢?這似乎是必須要串聯多個不同的指令才能做到,但是小生不才對於 Linux 的指令研究不深入,找了好多資料還是沒有頭緒,不知道有沒有人能指點一下呢?非常地感謝!

2012/2/10 7:21
The owl of Minerva spreads its wings only with the falling of the dusk.

--- G.W.F. Hegel (1770 - 1831)
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員四級
註冊日期:
2010/8/12 15:54
等級: 18
HP : 0 / 443
MP : 135 / 11026
EXP: 72
離線
man grep

-R, -r, --recursive
Read all files under each directory, recursively; this is equivalent to the -d recurse option.

2012/2/10 9:32
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員三級
註冊日期:
2011/11/13 1:05
等級: 11
HP : 0 / 270
MP : 54 / 5744
EXP: 82
離線
好編輯器,不用嗎?

附件:



png  madedit.png (12.02 KB)
28184_4f34ae3344a83.png 682X491 px

2012/2/10 13:42
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員四級
註冊日期:
2008/11/20 21:32
等級: 20
HP : 0 / 487
MP : 163 / 14577
EXP: 48
離線
我有一個現成的,不完美,但確定可以用,參考看看

下載:http://www.box.com/s/yrfkfo46jqlv3fpdcunh

內容:

#!/bin/bash

# =================================================================
# 字串搜尋並取代工具 v0.21 最後修改日期:2006-06-19
#
# 使用方式 sw.sh [檔案名稱] [原字串] [取代字串] [是否顯示訊息(可省略)]
# 參數四,輸入 1 代表要顯示訊息。可省略,若省略則預設為:不顯示訊息
#
# 本腳本目前無還原功能,一旦取代就無法還原,建議重要資料請先備份再操作!
# ==================================================================
#
# 版本演進:
#
# v0.2 新增可以處理含 [\] [/] 特殊字元的字串
# 若要搜尋並取代含 [\] 的字串,代入參數時必須以 '' 單引號框住
#
# ==================================================================


# 讀入參數
fileName=$1
sourceWord=$2
destinationWord=$3
isShow=$4


# ======================================================
# 定義函數
# ======================================================

# 取代功能
# $1 檔名,$2 原字串,$3 要取代的字串
function replace_word() {

# 例外處理一
# 因回存需要暫存 FIFO 檔,檢查 FIFO 檔案是否存在,不存在則自動建立
# FIFO檔的屬性為 p,所以要用 -p 來檢查
if [ ! -p "/tmp/replace_fifo" ];then
mkfifo -m=rw /tmp/replace_fifo
fi

# 例外處理二
# sed 的替換字串中,若有字元 [\] [/] 會發生錯誤
# 如果字串中有 [\] [/] ,則統統換成 [\\] [\/]
replaceSource=$( echo $( echo $2 | sed 's/[\]/\\\\/g' ) | sed 's/[/]/\\\//g' )
replaceDestination=$( echo $( echo $3 | sed 's/[\]/\\\\/g' ) | sed 's/[/]/\\\//g' )

# 步驟一
# 搜尋字串並取代,將結果存入 FIFO 檔
# 因 FIFO 檔會等待輸出而造成程式暫停,所以採用 & 背景作業
cat $1 | sed "s/$replaceSource/$replaceDestination/g" > /tmp/replace_fifo &

# 步驟二
# 回存資料到原檔名
cat /tmp/replace_fifo > $1
}


# 顏色字串輸出
# $1是否換行 (0-no,1-yes),$2 文字樣式碼,$3 顏色控制碼,$4要輸出的字串
# 文字樣式: 1-正常,4-底線, 7-標示
# 顏色:31-紅,32-綠,33-黃,34-藍,35-紫,36-青綠,38-亮白
function echo_color () {
if [ $1 -eq 0 ]; then
printf "\033[$2;$3m$4\033[0m"
else
printf "\033[$2;$3m$4\033[0m\n"
fi
}


# 顯示使用方法的訊息
function showInfo () {
echo
echo " ========================================================================"
echo " 字串搜尋並取代工具 v0.2 最後修改日期:2006-06-18 "
echo " ========================================================================"
echo
echo " 使用方式 s2p.sh [檔案名稱] [原字串] [取代字串] [是否顯示訊息(可省略)] "
echo " 參數四,輸入 1 代表要顯示訊息。可省略,若省略則預設為:不顯示訊息 "
echo
echo " 使用注意事項: "
echo " 1.本腳本目前無還原功能,一旦取代就無法還原,建議重要資料請先備份再操作!"
echo " 2.可以直接處理含 [\] [/] 特殊字元的字串,使用時請勿再加脫逸字元。 "
echo " 3.若要搜尋並取代含 [\] 的字串,代入參數時必須以兩個 ' '單引號框住。 "
echo
}



# ======================================================
# main
# ======================================================


# 檢查使用者是否有輸入參數 1,2,3,若無則顯示使用方法的訊息
if [ -z "$1" ];then showInfo ; exit ; fi
if [ -z "$2" ];then showInfo ; exit ; fi
if [ -z "$3" ];then showInfo ; exit ; fi

# 檢查參數一代入的檔案名稱是否存在,如不存在顯示錯誤訊息並跳出
if [ ! -f "$fileName" ];then
echo
echo_color 0 1 31 "錯誤!指定的檔案 "
echo_color 0 1 33 "$fileName"
echo_color 1 1 31 " 不存在...."
echo
exit
fi


# 如果參數四的值不為空,且值為 1,則顯示內容,否則直接轉換
if [ ! -z "$isShow" ] && [ $isShow = "1" ];then
echo
echo_color 0 1 31 "將字串 "
echo_color 0 1 33 "$sourceWord"
echo_color 0 1 31 " 取代成 "
echo_color 1 1 33 "$destinationWord"
echo
echo_color 1 1 32 "$fileName 取代前的內容:"
echo_color 1 1 32 "------------------------------------"
cat $fileName

# 呼叫取代功能函數
replace_word $fileName $sourceWord $destinationWord

echo
echo
echo_color 1 1 34 "$fileName 取代後的內容:"
echo_color 1 1 34 "------------------------------------"
cat $fileName

else
# 呼叫取代功能函數
replace_word $fileName $sourceWord $destinationWord
fi

echo
echo_color 1 1 35 "字串取代完成!!"
echo





說明:
這支 shell script 腳本
是設計用來替換某個檔案的字串
將 '字串A',替換為 '字串B'

用來替換 html 碼中的圖片連結,不錯用

它一次只能替換一個檔案

但是可以把它當一個"工具"
再寫另一支腳本,利用這個"工具"去「批次替換」

比如:

#!/bin/sh

# 調查目錄的檔案列表,儲存成文字暫存檔
ls > /tmp/檔案列表.txt

# 用迴圈依序讀入 /tmp/檔案列表.txt 中的資料(即檔名)
# 輸出給替換字串腳本工具,執行替換字串
while read fileName ;do
s2p.sh $fileName '原字串' '要替換的字串'
done < /tmp/檔案列表.txt




如果樓主有辦法把這個腳本改得更完美
比如可以直接批次替換,更穩定,可還原...什麼的

請不吝分享出來 ^^b

2012/2/10 14:20
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
版主
註冊日期:
2008/7/14 0:03
來自 螢幕的另一端
等級: 32
HP : 0 / 798
MP : 496 / 24723
EXP: 94
離線
ubuntu 內建此功能
在"開始選單 => 位置 => 搜尋檔案 => 顯示進階選項"

這樣就可以找檔案內的文字,還包括子目錄搜尋功能呢!

補充 acman 的內容:
範例:
grep "debian" -rf /home/backup/blog筆記/*.htm

附件:



png  search.png (105.55 KB)
11931_4f34d48e5e611.png 847X476 px

2012/2/10 16:26
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員二級
註冊日期:
2011/12/15 17:29
等級: 5
HP : 0 / 122
MP : 16 / 2569
EXP: 90
離線
關於(◕ ◡◡ ◕) 大大的script ...
1)sed -i 參數可以直接修改原檔案,所以就不用mkfifo了
2)多檔案處理部分,使用find 指令配合 -exec 參數或 find 指令配合xargs 指令,就不需要迴圈了

一般我看一些簡單的code 我是利用grep & find & sed 進行搭配.但是研究大型code,我就直接用 GNU global 了

推 GNU global

2012/2/10 17:07
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員四級
註冊日期:
2008/11/20 21:32
等級: 20
HP : 0 / 487
MP : 163 / 14577
EXP: 48
離線
粽子 寫到:

1)sed -i 參數可以直接修改原檔案,所以就不用mkfifo了
2)多檔案處理部分,使用find 指令配合 -exec 參數或 find 指令配合xargs 指令,就不需要迴圈了

一般我看一些簡單的code 我是利用grep & find & sed 進行搭配.但是研究大型code,我就直接用 GNU global 了

推 GNU global



很有用的指導,讚
感謝

2012/2/10 21:43
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
版主
註冊日期:
2008/5/13 23:12
來自 Ciudad de Kaohsiung, Taiwán
等級: 15
HP : 0 / 369
MP : 94 / 11608
EXP: 76
離線
感謝多位前輩的熱心指點,首先,對於 acman 所提的那個指令真的非常的強大,我到現在才知道可以這樣用,不過有一點比較奇怪的是,它在執行內容搜尋時,似乎連二進位檔案的內容也不放過,有辦法讓他排除二進位檔案嗎?也感謝夢見草前輩提供的方法,原來那個檔案搜尋功能還有提供內文檢索,看起來似乎是滿人性化的設計。

也感謝 guestX 推薦的編輯器,只可惜我目前的專案無法使用該編輯器,因為那是個本身掛有 Maven 的超大型 Java EE 專案,然而,我後來誤打誤撞地也發現了,在 NetBeans 裡的確是有提供這種內文搜尋功能的,只要按下 Ctrl + Alt + Shift + O 就可以了,呵呵!是個非常實用的功能,但是如果在軟體專案目錄之外的話,就還是得用前面兩位前輩提供的方法了。

2012/2/10 23:41
The owl of Minerva spreads its wings only with the falling of the dusk.

--- G.W.F. Hegel (1770 - 1831)
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員四級
註冊日期:
2010/8/12 15:54
等級: 18
HP : 0 / 443
MP : 135 / 11026
EXP: 72
離線
Hapsburg 寫到:
感謝多位前輩的熱心指點,首先,對於 acman 所提的那個指令真的非常的強大,我到現在才知道可以這樣用,不過有一點比較奇怪的是,它在執行內容搜尋時,似乎連二進位檔案的內容也不放過,有辦法讓他排除二進位檔案嗎?


-I Process a binary file as if it did not contain matching data; this is equivalent to the --binary-files=without-match option.

就是他了...

2012/2/12 12:46
應用擴展 工具箱
回覆: 大量文字檔內容搜尋指令~~~
會員二級
註冊日期:
2009/7/23 12:53
等級: 8
HP : 0 / 194
MP : 32 / 5444
EXP: 78
離線
針對上面的shell script
我使用的結果變成文字檔內容全部都被清光光了
是因為特殊字符的原因嗎?

將字串 fy6877 取代成 FFFFFFFF


將字串 fy6877 取代成 FFFFFFFF
aaa.txt 取代前的內容:
------------------------------------
/home/fy6877/rt/test/7z.sh
/home/fy6877/rt/test/[XLD][120411] 三浦サリー - 泣キ歌 (.flac).rar
/home/fy6877/rt/test/sw.sh
/home/fy6877/rt/test/[XLD][120411] 三浦サリー - 恋ノ歌 (.flac).rar
/home/fy6877/rt/test/aaa.txt


aaa.txt 取代後的內容:
------------------------------------


linux沒有自帶可輸入正則語法命令的取代工具嗎?
像vi這種工具都要打開文件後才可以做取代
不適合用在shell script @.@

2012/5/22 22:43
應用擴展 工具箱

(1) 2 »

 [無發表權] 請登錄或者註冊


可以查看帖子.
不可發帖.
不可回覆.
不可編輯自己的帖子.
不可刪除自己的帖子.
不可發起投票調查.
不可在投票調查中投票.
不可上傳附件.
不可不經審核直接發帖.