unix查找并替换dir和subdirs中的文本

jml*_*jml 1 unix perl grep replace sed

我正在尝试在给定主目录和子目录中的所有文档中将"my-silly-home-page-name.html"的名称更改为"index.html".

我看到了这个:Shell脚本 - 使用字符串列表搜索和替换多个文件中的文本.

这个:如何更改目录中所有文件中所有出现的单词

我试过这个:

grep -r "my-silly-home-page-name.html" .
Run Code Online (Sandbox Code Playgroud)

这会找到文本所在的行,但现在我想用'my-silly-home-page-name'替换'index'.我怎么用sed或perl做这个?或者我甚至需要sed/perl?

就像是:

grep -r "my-silly-home-page-name.html" . | sed 's/$1/'index'/g'
Run Code Online (Sandbox Code Playgroud)

也; 我正在尝试使用perl,我尝试以下方法:

perl -i -p -e 's/my-silly-home-page-name\.html/index\.html/g' *
Run Code Online (Sandbox Code Playgroud)

这有效,但是当perl遇到目录时我收到错误,说"无法进行就地编辑:SOMEDIR-NAME不是常规文件,<>行N"

谢谢,jml

ike*_*ami 7

find . -type f -exec \
   perl -i -pe's/my-silly-home-page-name(?=\.html)/index/g' {} +
Run Code Online (Sandbox Code Playgroud)

或者如果你find不支持-exec +,

find . -type f -print0 | xargs -0 \
   perl -i -pe's/my-silly-home-page-name(?=\.html)/index/g'
Run Code Online (Sandbox Code Playgroud)

两者都尽可能多地传递给Perl作为参数.两者都适用于任何文件名,包括那些包含换行符的文件名.


如果您使用的是Windows并且使用的是Windows版本的Perl(而不是cygwin版本),-i除非您还对原始版本进行备份,否则将无法使用.更改-i-i.bak.然后,您可以使用以下命令删除备份

find . -type f -name '*.bak' -delete
Run Code Online (Sandbox Code Playgroud)