从多个文件中删除行

时间:2009-11-19 16:56:08

标签: windows language-agnostic replace

如何从目录树中的多个文件中搜索和删除一行(而不是替换)?我尝试过像grepWin和Windows Grep这样的程序,但是它们会替换行,它们不会删除整行。什么是我最好的选择?

示例:搜索“hello”并删除其中包含“hello”的任何行。

yo
hello hey hey
hi hello
bye 
bye

应该回来

yo
bye
bye

7 个答案:

答案 0 :(得分:2)

Powershell位于根目录中:

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

将* .txt过滤器和“ Hello ”匹配条件更改为您想要的任何内容。

答案 1 :(得分:2)

假设文件的扩展名为.foo,则应执行以下操作:

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

hth - Rene

答案 2 :(得分:1)

grep -R --revert-match

可能会奏效。一些GNU grep版本支持通过文件掩码进行递归搜索,但我不确定Windows端口。

更长但更简单的方式,

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

其中gfind是GNU find,例如,unxutils.sf.net,而deleteLine.bat就像:

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

答案 3 :(得分:1)

如果你有cygwin,你可以使用sed:

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

这将删除带有hello的行,但显示空行。如果你不喜欢blan line,你可以这样做:

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

编辑:第二个想法,完整的东西可以简化为:

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

其中test.txt是文件。

答案 4 :(得分: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。

答案 5 :(得分:0)

perl -i.bak -ne 'print unless m/pattern/' file1 file2 file3 ...

答案 6 :(得分:0)

我在grepWin或Windows Grep中找到了一种方法来实现它。

正则表达式搜索:^。你好。 $ \ r \ n 正则表达式替换:

(空白替换)