gpt4 book ai didi

linux - Perl 正则表达式递归替换多个文件组中的字符串,如 "*.php" "*.html"

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:21 25 4
gpt4 key购买 nike

下面的命令不起作用,什么都不做:

sudo find /srv/my/directory -type f -iname '*.htm*' -iname '*.old1' -iname '*.php' | sudo xargs -iX sudo perl -p -i -e 's|\<\?php.*123456.*123456.*\?\>\r?\n\<\?php|<?php|g' 'X'

它不会替换文件中的任何内容。

怎么了?

解决方案:

sudo find /srv/my/directory -type f -iname '*.htm*' -or -iname '*.old1' -or -iname '*.php' | sudo xargs -iX sudo perl -0777 -p -i -e 's|\<\?php.*123456.*123456.*\?\>\r?\n\<\?php|<?php|g' 'X'

解决方案 2(扩展正则表达式中多种情况的能力):

sudo find /srv/my/directory -type f -iname '*.htm*' -or -iname '*.old1' -or -iname '*.php' | sudo xargs -iX sudo perl -0777 -p -i -e 's@\<\?php.*123456.*123456.*\?\>(\r?\n|\#\!.*)\<\?php@<?php@gs' 'X'

最佳答案

  1. 当为 find 指定多个条件时,它们默认由隐式 -and 连接。没有文件可以匹配 -iname '*.old1' -and -iname '*.php' 。您必须明确指定 -or

  2. 除非另有说明,否则 perl -p 会逐行读取文件,因此它无法匹配 \n< 。使用 -0777 读取整个文件,而不是逐行处理它。

sudo find /srv/my/directory -type f \
-iname '*.htm*' -or -iname '*.old1' -or -iname '*.php' \
| sudo xargs -iX sudo perl -0777 -p -i \
-e 's/<\?php.*123456.*123456.*\?>\r?\n<\?php/<?php/g' 'X'

顺便说一句,您不需要在 Perl 正则表达式中反斜杠 <>

关于linux - Perl 正则表达式递归替换多个文件组中的字符串,如 "*.php" "*.html",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52533735/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com