我有数百个.htm文件。它们各有不同,但它们在最后都有相似的链接:
<a href="123-04.htm">Please Consult 345.</a>
&#34; 123-04&#34;文件名和&#34; 345&#34;可能会在集合中的所有.htm文件中有所不同,但是&#34;请咨询&#34;总是一样的。
所以我想搜索所有.htm文件中的字符串&#34;请咨询&#34;然后将<a name="Tag"></a>
添加到每个文件中出现的行的开头,以生成以下内容:
<a name="Tag"></a><a href="123-04.htm">Please Consult 345.</a>
我尝试了一些事情。首先是使用findstr,它可以找到字符串,但永远无法准确报告行号。它总是报告第1行。从阅读开始,我认为这是因为.htm文件是UNIX。我不知道这意味着什么,但已经读到它干扰了findstr。再一次,新手,我的道歉。
我根据我在此网站上找到的解决方案编写了一个示例脚本,该解决方案使用for /f
逐步执行该文件,我想我已经做了一些事情,但我无法弄清楚如何拥有它#34 ;外观&#34;对于&#34;请咨询&#34;字符串,因为它在行的中间。并且没有分隔符或任何我可以用来指定令牌的东西,对吧?该脚本将所有行复制到一个新文件中,如果它在步进时找到特定字符串,它会在该行下面插入另一个字符串到新文本文件中:
@echo off
setlocal enabledelayedexpansion
for /f %%x in (sample.txt) do (
set line=%%x
echo %%x>>newfile.txt
call :ADD
)
:ADD
if /I "!line!"=="1" (
echo inserttext>>newfile.txt
)
sample.txt只包含10行,每行有自己的编号(1到10)。当然,这是有效的,所以我认为我已经开始了一个概念验证的道路,但它并不是我所需要的。我知道IF语句不会使用通配符,所以我不确定这是否正确,因为我需要搜索的字符串位于行的中间位置,而不是比起在sample.txt。
中的开头毋庸置疑,我被困住了。我已经批量处理了这个问题,但是我打开了使用PowerShell或Windows上本质上可用的任何东西。这是为了工作,所以我不能直截了当地获得特别的东西。如果这是MATLAB或FORTRAN或我以前广泛使用过的东西,我确定我可以弄明白,但我对这些工具的知识不够。我希望我提供了一个详细的问题,并在尝试找到已有的答案时表现出尽职调查。
答案 0 :(得分:0)
正规表达救援!
$input = Get-Content InputFile.txt
$input -replace '(<a.*?>.*?Please Consult.*?<\/a>)','<a name="Tag"></a>$1' | Out-File OutputFile.txt
基本想法:
正则表达式'(<a.*?>.*?Please Consult.*?<\/a>)'
匹配包含“请咨询”字样的所有<a>
和</a>
标记
正则表达式.*?
基本上匹配任何文本惰性(即,一旦你点击括号,停止)。最后()
括号创建了一个“匹配组”,我们将在替换中使用它。
下一部分:'<a name="Tag"></a>$1'
是替换文字。
我们希望替换为<a name="Tag"></a>
,然后替换为$1
,这是匹配组的内容。 (即那里有什么)。
如果需要更多PowerShell,您可以添加循环来迭代文件并根据需要自动执行替换。