我正在寻找一种方法来查找和替换大量的文本文件。例如;
我想选择;
<li><a href="">Istanbul, TR POS </a></li>
<li><a href="">Ankara, TR POS </a></li>
<li><a href="">Izmir, TR POS </a></li>
WITH;
<li><a href="pos-istanbul-tr.php">Istanbul, TR POS </a></li>
<li><a href="pos-ankara-tr.php">Ankara, TR POS </a></li>
<li><a href="pos-izmir-tr.php">Izmir, TR POS </a></li>
请注意,标签的首字母是小写的,也是作为链接的一部分添加的。这应该针对大量的文本文件来完成,所以我正在通过正则表达式或您认为可能有用的任何软件寻找最有效的方法。
答案 0 :(得分:5)
$ perl -i.bak \
> -pe's/href="">([^,]+)/\'href="pos-\'. (lc $1) . \'-tr.php">\'. $1/eg' \
> *.html
将其保存到fill-href.pl
:
#!/usr/bin/perl -w -pi.bak
s/href="">([^,]+)/href="pos-\L$1\E-tr.php">$1/g
执行命令
perl fill-href.pl test1.html test2.html
答案 1 :(得分:1)
perl -pi.bak -e 's%<li><a href="">(\W+), TR POS </a></li>%<li><a href="pos-\L$1\E-tr.php">$1, TR POS </a></li>%g;' file1 file2 ...
未经测试 - 可能过度简化,但应该处理样本数据。 '-p
'导致Perl打印每一行; “-i.bak
”会使用“.bak
”扩展名创建文件备份并覆盖原始文件。
答案 2 :(得分:1)
如果您碰巧有权访问Perl兼容的正则表达式(PCRE)引擎,例如PHP的preg_replace()
,甚至是Perl,如果必须;-),您可以替换此正则表达式:
<a href="">([^,]+),\s+(\w+)\s+(\w+)
用这个:
<a href="\L$3-$1-$2\E.php">$1, $2 $3
\L
和\E
修饰符为您执行下限。
$i = '<li><a href="">Izmir, TR POS </a></li>';
$r = '/<a href="">([^,]+),\\s+(\\w+)\\s+(\\w+)/';
$s = '<a href="\\L$4-$2-$3\\E.php">$1, $2 $3';
$o = preg_replace($r, $s, $i);
echo $o;
VI / VIM在反向引用中有类似的操作案例机制。
答案 3 :(得分:1)
使用textmate正则表达式引擎你需要的是:
查找:&lt; li&gt;&lt; a href =“”&gt;([A-Za-z] +),TR POS&lt; / a&gt;&lt; / li&gt;
替换:&lt; li&gt;&lt; a href =“pos- \ L $ 1-tr.php”&gt; $ 1,TR POS&lt; / a&gt;&lt; / li&gt;
注意第一个替换有一个修饰符,它将第一个匹配作为小写。第二个$ 1没有修饰符。我测试它,它完全符合你的需要。
答案 4 :(得分:0)
我认为您需要编程来执行此操作,因为您想要操作匹配的文本。
如果你在拥有它的平台上,awk听起来非常可行。或者你可以用Python,Perl或任何你喜欢的东西鞭打一些东西。实际代码很可能会有其他答案。
答案 5 :(得分:0)
如果你在Linux上,你会发现这个帖子很有帮助:
您可以使用命令行工具(如sed),Python / Perl等脚本语言或任何其他解决方案来执行此操作。如果您可以提供有关您正在寻找的内容以及需要运行的操作系统的更多详细信息,那么将有助于提供更具体的答案。
答案 6 :(得分:0)
使用一些能够正则表达式和“在文件中搜索”的文本编辑器。 例如。 EditPlus的
然后替换
<li><a href="">([A-Za-z]+), TR POS <\/a><\/li>
与
<li><a href="pos-\1-tr.php">\1, TR POS </a></li>
(可能还需要一些转义,即反斜杠...)