如何从目录树中的多个文件中搜索和删除一行(而不是替换)?我尝试过像grepWin和Windows Grep这样的程序,但是它们会替换行,它们不会删除整行。什么是我最好的选择?
示例:搜索“hello”并删除其中包含“hello”的任何行。
yo
hello hey hey
hi hello
bye
bye
应该回来
yo
bye
bye
答案 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 正则表达式替换:
(空白替换)