2009-11-19 72 views
1

如何從目錄樹中的多個文件中搜索並刪除一行(而不是替換)?我已經嘗試過諸如grepWin和Windows Grep等程序,但是它們會替換行,它們不會刪除整行。我最好的選擇是什麼?刪除多個文件中的行

示例:搜索「hello」並刪除其中包含「hello」的任何行。

yo 
hello hey hey 
hi hello 
bye 
bye 

應該回來

yo 
bye 
bye 
+0

因爲您沒有指定語言,因此使用與語言無關的標記。如果語言確實重要,可以隨意更改。 – Mizipzor 2009-11-19 17:02:38

+1

由於您使用了Windows工具,因此使用Windows進行標記。如果平臺是真正的操作系統,請隨時更改。 – 2009-11-19 17:37:58

回答

0

我在grepWin或Windows Grep中找到了一個方法來完成它。

正則表達式搜索:^。 你好。 $ \ r \ n 正則表達式替換:

(空白代替)

0
 
perl -i.bak -ne 'print unless m/pattern/' file1 file2 file3 ... 
1
grep -R --revert-match 

可能會奏效。一些GNU grep版本確實支持通過文件掩碼進行遞歸搜索,但我不確定Windows端口。

更長時間,但更簡單的方法,

gfind . -name "*.txt" | xargs deleteLine.bat hello 

其中gfind是GNU從發現,例如,unxutils.sf.net和deleteLine.bat是這樣的:

grep %1 --revert-match %2 > tempfile.### 
move tempfile.### %2 
1

如果你有Cygwin的,你可以使用SED:

cat test.txt | sed 's/.*hello.*//' 

這將刪除與喂線,但顯示空行。如果你不喜歡BLAN線,你可以這樣做:

cat test.txt | sed 's/.*hello.*//' | sed '/^$/d' 

編輯:關於第二個想法,整個事情可以簡化爲:

sed '/.*hello.*/d' test.txt 

其中test.txt的是文件。

+0

這也將刪除所有其他空白行。 您可以使用<,不使用cat來將文件傳輸到sed。 – 2009-11-19 17:08:38

1

我建議安裝cygwin,如果你還沒有它 - 它是充滿了這樣的事情的工具。

你可以用SED刪除線:

sed -i '/pattern/d' filename... 

-i選項告訴sed編輯就地文件。 -i.bak將會保留一個擴展名爲.bak的備份文件。

要處理目錄樹中的所有文件,我建議在zsh中運行該命令。與bash相比,Zsh有一些時髦的文件名擴展選項,例如

sed -i '/pattern/d' **/*.(c|h) 

將在當前目錄下的每個文件上運行sed,該文件的擴展名爲.c或.h。

1

使用PowerShell定位在根目錄下:

foreach($file in (dir -r -i *.txt -force)) { $cleaned = gc $file | where { $_ -notlike "*Hello*" }; sc $file $cleaned } 

更改* .TXT過濾器和「你好」匹配的標準,無論你想要的。

2

假設,該文件有包含.foo的延伸,下面應該做的:

for /f %f in ('dir /s /b *.foo') do findstr /v hello %f > c:\temp\x && move /y c:\temp\x %f 

心連心 - 劉若英