使用vi查詢檔案中指定內容並輸出到檔案

2022-09-13 19:33:16 字數 1158 閱讀 6213

今天碰到這樣乙個需求,大概有100多個檔案,需要從這些檔案裡面找到一些具有相同格式的**,然後把他們統一輸入到乙個txt中去。拿到需求後,我的第乙個想法就是使用vi,於是就嘗試了一下,得到了乙個不是很好的解決方案,如下:

:set nows

:map \1 gg:.,.write >> c:\temp.txt\2

:map \2 /^[ \t]*form ma/^[ \t]*with frame .*\.mb:'a,'bwrite >> c:temp.txt\2

:map \] :n\1

set nows

是用來關閉迴圈搜尋的,vi缺省會迴圈搜尋乙個檔案,這樣的話,我們就沒有結束的條件了,所以要關閉它。

map \1 gg:.,.write >> c:\temp.txt\2

用來map乙個命令\1,gg代表到第一行,:.,.表示複製第一行,

write

>>

c:\temp.txt表示寫到乙個檔案,\2是之後還會map的乙個命令。注意到,因為需求的細節裡面有要求把找到的**和它們所

在的檔名做關聯的要求,而所處理的檔案第一行是包含檔名的注釋,所以這樣做可以達到要求。另外,輸出時使用了絕對路徑,這是因為需要處理多個檔案,而

vi在多檔案編輯模式下之只能讀寫絕對路徑檔案,這也是對的,因為如果編輯的檔案處在不同目錄,那麼相對路徑就是不定的了。

map \2 /^[ \t]*form ma/^[ \t]*with frame .*\.mb:'a,'bwrite >> c:temp.txt\2

用來map乙個命令\2,

/^[ \t]*form 表示尋找乙個文字模式,ma表示把找到的那一行標記為a,

/^[ \t]*with frame .*\.表示尋找另乙個文字模式,mb表示把找到的那一行標記為b,

:'a,'b表示複製a和b之間的文字,

write >> c:temp.txt表示輸出到檔案,\2表示迴圈呼叫\2直到找不到文字模式(這就是為什麼要set nows的原因)。

map \] \1

:n\]

用來map乙個命令\],\1表示查詢文字模式並輸出到檔案,

:n表示切換到下乙個檔案,\]表示迴圈呼叫\]直到沒有下乙個檔案存在。

做好這些setting和map之後,把需要處理的檔案用乙個vi開啟,然後執行命令\],就得到想要的東西了。

linux下zip檔案內容查詢 ,檔案查詢並刪除

今天剛好遇到乙個需要查詢歸檔日誌中的內容,歸檔的格式是zip,假如是非壓縮包檔案,可以用grep命令去搜尋,例如 grep 被查詢的字串 檔名 假如是.gz壓縮包類或者是zip類,可以用zgrep命令去搜尋,例如 zgrep 被查詢的字串 檔名 如果需要遞迴 r 忽略大小寫 i 這些原有支援的都直接...

linux遞迴查詢檔案內容並替換

sed i s 原字串 替換後字串 g grep 搜尋關鍵字 rl data 目標目錄 include html 上面是遞迴查詢目錄中所有的html檔案 把包含符合關鍵字的檔案用sed去做替換 這裡要注意如果sed要替換的字串中如果有 之類的需要用 做轉義 多個替換用 分割 例如 sed i s 原...

gerp 1 查詢檔案中指定的字串,並列印該行

autho yj function like gerp command in linux find lines with a specified string in a file,and print these lines.usage grep string filename include inc...