我有一组 5000 多个文件,需要在其中进行简单的搜索和替换。我一直在文本编辑器 (EditPlus) 中执行此操作,一次打开 500 个文件,进行全局搜索/替换,保存所有文件,关闭等。但是,这实际上要花几个小时,而且很无聊和乏味,我今天已经做过一次了,需要再做一次,因为所有文件都刷新了。有没有办法通过 Bash 命令行做到这一点?以下是详细信息:
寻找onchange="document.location ='/products/view.html/view/'+this.value"
替换为onchange="alert('Not implemented')" style="display: none"
所有文件都有 .HTM 扩展名,但它们嵌套在几个子目录中。
编辑-我用的是 Mac,更喜欢基于 *nix 的解决方案。
答案1
您情况的基本命令如下:
sed -i 's|oldvalue|newvalue|g' file1 file2 file3
如果您的所有文件都在目录中~/foo/bar/
,那么您要做的就是:
cd '~/foo/bar/'
find . -type f | xargs sed -i "" "s|onchange=\"document.location ='/products/view.html/view/'+this.value\"|onchange=\"alert\('Not implemented'\)\" style=\"display: none\"|g"
编辑:glob(*
作为文件名)在文件数量非常多时可能会出现问题,并且不会进入子目录。在这种情况下,请更改最后一行。
编辑 2:使用 BSD sed(在 MacOS X 上使用的)-i
需要一个参数。顺便说一下使用xargs
。感谢@Dennis Williamson
答案2
由于 EditPlus 是一个 Windows 编辑器,我猜您想要一个 Windows shell 解决方案。
你可以获得适用于 Windows 的 sed 变体,但这里有一个电源外壳解决方案是递归地查找所有 *.HTM 文件,用“that”替换“this”,然后保存文件。
gci -Include *.HTM -Recurse | % {
(gc $_) -replace "this","that" | sc -path $_ }
使用字符串会让事情变得更加复杂,因为您嵌入了双引号和单引号以及正则表达式字符。引号使用反引号 (`) 转义,正则表达式字符使用反斜杠 (\) 转义。
gci -Include temp*.HTM -Recurse | % {
(gc $_) -replace "onchange=`"document\.location `
=`'/products/view\.html/view/`'\+this\.value",`
"onchange=`"alert(`'Not implemented`')`" style=`"display: `
none`"" | sc -path $_ }
Powershell 包含在 Windows 7 中,可供 XP 及以上版本下载。
有一个StackOverflow 上的 vbscript 单文件解决方案我发帖回应“是否有任何类似 sed 的 cmd.exe 实用程序?” 这个问题包含许多答案,并提供了有关 Windows 命令行 sed 解决方案的建议。