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
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)