搜索特定的文本字符串,然后替换字符串

时间:2015-03-29 01:56:15

标签: powershell powershell-v2.0 powershell-v3.0

我有一个PHP文件,其内容与此类似:

<table class="select_descript" cellspacing="4" cellpadding="0" border="0" align="center" valign="middle"><tbody><tr><td>Top songs for the past week. Updated Saturday, 21 March 2015</td></tr></tbody></table>

我在那里有日期,我希望能够在此PHP文件中用当前日期替换此日期部分。我正在考虑使用查找valign="middle"><tbody><tr><td>和单词Updated并使用-replace方法。

$phpfile = phpfile.php
(Get-Content $phpfile) -replace "(?<=Updated ).+","Updated (Get-Date).ToLongDateString()"

但我坚持表达。

1 个答案:

答案 0 :(得分:1)

您不能说在什么情况下文件被更改。我的第一个建议是创建一个源模板文件,其中包含当前日期所在的唯一标记。

...<td>Top songs for the past week. Updated [[DATE_HERE]]</td>...

然后更换是直截了当的,大多是万无一失的。

(gc template.php) -replace '[[DATE_HERE]]',(Get-Date).ToLongDateString() | sc $phpfile

对于正则表达式解决方案,您需要标识位置但最不可能更改的字符串。我不会尝试根据HTML标记进行解析,或者格式设置的更改会破坏正则表达式。在你的例子中,我将使用整个&#34;热门歌曲......&#34;文本。

$searchText = 'Top songs for the past week. Updated [^<]*'
$replaceText = "Top songs for the past week. Updated $((Get-Date).TolongDateString())"

(Get-Content $phpfile -Raw) -replace $searchText,$replaceText | Set-Content $phpfile

请注意,-Raw的{​​{1}}参数会导致它一次读取整个文件,然后关闭文件,以便在传递相同的文件名时不会出现错误设定内容。