命令行查找/替换帮助

命令行查找/替换帮助

我有一组 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 解决方案的建议。

相关内容