Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Html 如何将正则表达式模式匹配转换为小写以便URL标准化/整理_Html_Regex_Bash_Url_Awk - Fatal编程技术网

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

Html 如何将正则表达式模式匹配转换为小写以便URL标准化/整理,html,regex,bash,url,awk,Html,Regex,Bash,Url,Awk,我目前正在尝试将网站上的所有链接、文件和标记从大写.ext和CamelCase.ext转换为小写.ext 我可以使用正则表达式匹配href=“[^”]*”和src=“[^”]*” 这似乎可以很好地识别HTML中的链接和图像 但是,我需要做的是获取匹配项并对匹配项运行ToLowercase()函数。因为我有很多要解析的页面,所以我想制作一个短shell脚本,它将在指定的目录和模式上运行,与指定的正则表达式匹配,并对它们执行小写操作。您想要这个吗 kent$ echo "aBcDEF"|sed '

我目前正在尝试将网站上的所有链接、文件和标记从
大写.ext
CamelCase.ext
转换为
小写.ext

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

但是,我需要做的是获取匹配项并对匹配项运行
ToLowercase()
函数。因为我有很多要解析的页面,所以我想制作一个短shell脚本,它将在指定的目录和模式上运行,与指定的正则表达式匹配,并对它们执行小写操作。

您想要这个吗

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

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

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

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


Perl one liner将所有常规文件重命名为小写:

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,并使用Perl版本5.8.9和5.10.0的bash shell对其进行了测试。

选中了sed transform
y
?此示例中是否存在语法错误?当我在Macbook上尝试此操作时,我收到消息:sed:1:“/path/to/files/…”:命令a预期\后跟文本(显然,/path/to/files/不是我要放的路径。)请注意,末尾有一个
*
(星形)。
sed
不需要目录,而是一个或多个文件。使用文件掩码,shell应该将路径扩展到匹配的文件(我使用了
*
,意思是“所有文件”)。文件路径中包含了*。可能您的shell没有将文件掩码扩展为文件。为此,您可以使用xargs:
ls/path/to/files/*| xargs sed-i'-re/(href | src)=“[^”]*”/\L&/g'
。如果文件名中有空格,则需要这样的内容:
find/path/to/files/-maxdepth 1-print0 | xargs-0 sed-i'-re/(href | src)=“[^”]*“/\L&/g'
或使用-exec:
find/path/to/files/-maxdepth 1-exec sed-i'-re/(href | src)=“[^]*//g'/\L''\;
谢谢。收到错误消息“替换未终止于-e行1。”虽然.Syntax error?哪个命令?这不重要,因为我刚刚将所有三个命令粘贴到我的终端中,它们运行正常…我尝试了最后一个命令,因为您指出它可以在文件中工作。也许这是perl的构建/版本有问题?我使用的是Macbook。
find /path/to/files -name "*.html" -exec perl -pi -e 's/\b(src|href)="(.+)"/$1="\L$2"/gi;' {} \;
find . -name "*.html" -exec perl -pi -e \
    '$q=qr/"|\x39/; s{\b(src|href)=($q?.+$q?)\b}{$1=\L$2}gi;' {} +