【问题标题】:Powershell: append text after string in filePowershell:在文件中的字符串后附加文本
【发布时间】:2020-07-30 13:08:24
【问题描述】:

问题:我试图在标签后附加一个字符串。我有一个很大的文本文件,我只需要在标签后面附加一些文本(包括文本 xxxxxx)<xxxxxx>,我现在似乎无法弄清楚。

目前我正在尝试使用正则表达式:<[(xxxxxx)]+>,根据 regex101.com,它确实匹配确切的标签 <xxxxxx>,但是当我在 Powershell 中使用它时,它会返回很多其他的东西。

如何确保 Powershell 仅匹配 <xxxxxx> ?并在<xxxxxx> 之后附加一些字符串?

来自文本文件的示例 sn-p:PredefinedSettings=<xxxxxx><abc test123 /abc></xxxxxx>

示例 PS 命令:Get-Content .\samplefile.ini | Select-String -Pattern "<[(xxxxxx)]+>"

返回整行 PredefinedSettings=<xxxxxx><abc test123 /abc></xxxxx> 而不仅仅是 <xxxxxx>

【问题讨论】:

  • 能否请您添加您正在使用的PS代码?
  • 但是,如果您需要附加一些文本,为什么不-replace / .Replace?如果<xxxxxx> 是硬编码的,就像(Get-Content $f).Replace("<xxxxxx>", "<xxxxxx>SOME TEXT") 一样?为什么是正则表达式,顺便说一句?

标签: regex powershell text tags append


【解决方案1】:

如果您只想输出匹配的文本,您可以执行以下操作:

Select-String -Path sample.ini -Pattern '<(/?xxxxxx)>' -AllMatches | Foreach-Object {
    $_.Matches.Groups[1].Value # Outputs matched text between `<>`
    $_.Matches.Value # Outputs all matched text
}

-AllMatches 开关将允许在第一个匹配之后进行匹配。所以它会返回&lt;xxxxxx&gt;&lt;/xxxxxx&gt;


如果要替换文件中的文本,可以执行以下操作:

(Get-Content .\samplefile.ini) -replace '<(/?xxxxxx)>','<$1Text>' |
    Set-Content .\sampplefile.ini

如果您的替换文本在变量中,您需要为捕获组转义 $

$Text = 'replacement Text'
(Get-Content .\samplefile.ini) -replace '<(/?xxxxxx)>',"<`$1$Text>" |
    Set-Content .\sampplefile.ini

$1 是在第一个 () 中匹配的捕获组 1 数据。根据您的Text,命名您的捕获组可能是明智之举。如果Text23OtherText&lt;$123OtherText&gt; 将尝试替换捕获组123。使用命名的捕获组,您可以执行以下操作:

(Get-Content .\samplefile.ini) -replace '<(?<Tag>/?xxxxxx)>','<${Tag}Text>' |
    Set-Content .\sampplefile.ini

/? 匹配零个或多个 / 字符。

-replace 将返回所有不匹配的文本以及所有被操作符替换的文本。

【讨论】:

    【解决方案2】:

    我希望你的问题是正确的。

    在正则表达式中,量词是贪婪的,所以它会从第一个打开标记到最后一个结束标记进行选择,您可以使用 ? 更改它。

    所以你的正则表达式将是&lt;[(xxxxxx)]+?&gt;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-21
      • 1970-01-01
      • 2023-03-07
      • 2023-01-11
      • 2014-05-02
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      相关资源
      最近更新 更多