批处理:在同一行

时间:2017-03-21 20:07:39

标签: string powershell batch-file

我有数百个.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或我以前广泛使用过的东西,我确定我可以弄明白,但我对这些工具的知识不够。我希望我提供了一个详细的问题,并在尝试找到已有的答案时表现出尽职调查。

1 个答案:

答案 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,您可以添加循环来迭代文件并根据需要自动执行替换。