如何将正则表达式模式匹配转换为小写以进行 URL 标准化/整理

发布于 2024-12-09 16:04:07 字数 365 浏览 3 评论 0原文

我目前正在尝试将网站上的所有链接、文件和标签从 UPPERCASE.extCamelCase.ext 转换为 lowercase.ext

我可以使用 href="[^"]*"src="[^"]*" 的正则表达式匹配来匹配页面中的链接 这似乎可以很好地识别 HTML 中的链接和图像。

然而,我需要做的是获取匹配并在匹配上运行 ToLowercase() 函数。由于我有很多想要解析的页面,因此我希望制作一个简短的 shell 脚本,该脚本将在指定的目录上运行,并且模式与指定的正则表达式匹配,并对它们执行小写操作。

I am currently trying to convert all links and files and tags on my site from UPPERCASE.ext and CamelCase.ext to lowercase.ext.

I can match the links in pages using a regular expression match for href="[^"]*" and src="[^"]*"
This seems to work fine for identifying the link and images in the HTML.

However what I need to do with this is to take the match and run a ToLowercase() function on the matches. Since I have a lot of pages that I'd like to parse through, I'm looking to make a short shell script that will run on a specified directory and pattern match the specified regexes and perform a lowercase operation on them.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

弥繁 2024-12-16 16:04:07

Perl 单行将所有常规文件重命名为小写:

perl -le 'use File::Find; find({wanted=>sub{-f && rename($_, lc)}}, "/path/to/files");'

如果您想更具体地了解重命名哪些文件,您可以将 -f 更改为正则表达式或其他内容:

perl -le 'use File::Find; find({wanted=>sub{/\.(txt|htm|blah)$/i && rename($_, lc)}}, "/path/to/files");'

编辑:抱歉,在重读问题后我发现您还想替换文件中的出现次数:

find /path/to/files -name "*.html" -exec perl -pi -e 's/\b(src|href)="(.+)"/$1="\L$2"/gi;' {} \;

编辑 2:尝试这个,因为 find 命令使用 + 而不是 \;这是更有效的,因为多个文件一次传递到 perl(感谢另一篇文章中的@ikegami)。它还处理 URL 周围的 '"。最后,它使用 {} 而不是 // 用于替换,因为您正在替换 URL(也许 URL 中的 / 会混淆 Perl 或您的 shell?),这应该不重要,我在我的系统上尝试了两者,效果相同(两者都工作得很好),但值得一试:

find . -name "*.html" -exec perl -pi -e \
    '$q=qr/"|\x39/; s{\b(src|href)=($q?.+$q?)\b}{$1=\L$2}gi;' {} +

PS:我还有一台 Macbook,并使用 bash shell 和 Perl 版本 5.8.9 和 5.10.0 对其进行了测试。

Perl one-liner to rename all regular files to lowercase:

perl -le 'use File::Find; find({wanted=>sub{-f && rename($_, lc)}}, "/path/to/files");'

If you want to be more specific about what files are renamed you could change -f to a regex or something:

perl -le 'use File::Find; find({wanted=>sub{/\.(txt|htm|blah)$/i && rename($_, lc)}}, "/path/to/files");'

EDIT: Sorry, after rereading the question I see you also want to replace occurrences within files as well:

find /path/to/files -name "*.html" -exec perl -pi -e 's/\b(src|href)="(.+)"/$1="\L$2"/gi;' {} \;

EDIT 2: Try this one as the find command uses + instead of \; which is more efficient since multiple files are passed to perl at once (thanks to @ikegami from another post). It also It also handles both ' and " around the URL. Finally, it uses {} instead of // for substitutions since you are substituting URLs (maybe the /s in the URL are confusing perl or your shell?). It shouldn't matter, and I tried both on my system with the same effect (both worked fine), but it's worth a shot:

find . -name "*.html" -exec perl -pi -e \
    '$q=qr/"|\x39/; s{\b(src|href)=($q?.+$q?)\b}{$1=\L$2}gi;' {} +

PS: I also have a Macbook and tested these using bash shell with Perl versions 5.8.9 and 5.10.0.

×纯※雪 2024-12-16 16:04:07

使用 bash,您可以声明一个变量仅保存小写值:

declare -l varname
read varname <<< "This Is LOWERCASE"
echo $varname  # ==> this is lowercase

或者,您可以将一个值转换为小写(我认为是 bash 版本 4)

x="This Is LOWERCASE"
echo ${x,,}  # ==> this is lowercase

With bash, you can declare a variable to only hold lower case values:

declare -l varname
read varname <<< "This Is LOWERCASE"
echo $varname  # ==> this is lowercase

Or, you can convert a value to lowercase (bash version 4, I think)

x="This Is LOWERCASE"
echo ${x,,}  # ==> this is lowercase
诗酒趁年少 2024-12-16 16:04:07

你想要这个吗?

kent$  echo "aBcDEF"|sed 's/.*/\L&/g'
abcdef

或者

kent$  echo "aBcDEF"|awk '$0=tolower($0)'
abcdef

使用您自己的正则表达式:

kent$  echo 'FOO src="htTP://wWw.GOOGLE.CoM" BAR BlahBlah'|sed -r 's/src="[^"]*"/\L&/g'   
FOO src="http://www.google.com" BAR BlahBlah

you want this?

kent$  echo "aBcDEF"|sed 's/.*/\L&/g'
abcdef

or this

kent$  echo "aBcDEF"|awk '$0=tolower($0)'
abcdef

with your own regex:

kent$  echo 'FOO src="htTP://wWw.GOOGLE.CoM" BAR BlahBlah'|sed -r 's/src="[^"]*"/\L&/g'   
FOO src="http://www.google.com" BAR BlahBlah
调妓 2024-12-16 16:04:07

您可以将 sed-i 一起使用(就地编辑):

sed -i'' -re's/(href|src)="[^"]*"/\L&/g' /path/to/files/*

You could use sed with -i (in-place edit):

sed -i'' -re's/(href|src)="[^"]*"/\L&/g' /path/to/files/*
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文