【问题标题】:How to replace first and last part of each line with powershell如何用powershell替换每行的第一部分和最后一部分
【发布时间】:2018-12-26 00:56:18
【问题描述】:

我想使用 PowerShell 修改文本文件。

我想-替换

  • [REPLACE 在每一行的开头加上ENJOY
  • LINE] 在每行末尾加上LIFE
  • 仅当行以[REPLACE 开头并以LINE] 结尾时

-replace 中使用什么正则表达式来匹配这个请求?

示例 - 文件输入

[REPLACE_IN_THIS_LINE]
[DO_NOT_REPLACE_IN_THIS_LINE_PLEASE]
[REPLACE_VERY_MUCH_IN_THIS_LINE]
Do not replace in this line[REPLACE_IN_THIS_LINE]

示例 - 文件输出

ENJOY_IN_THIS_LIFE
[DO_NOT_REPLACE_IN_THIS_LINE_PLEASE]
ENJOY_VERY_MUCH_IN_THIS_LIFE
Do not replace in this line[REPLACE_IN_THIS_LINE]

如您所见,在此示例中,只有第 2 行和第 4 行发生了变化...

我想出了这个来匹配字符串:-match "^\[REPLACE.*LINE\]$" 但我不知道如何使用-replace 来正确替换...

【问题讨论】:

  • 发布您当前正在使用的正则表达式
  • @stetoc 我刚刚添加了用于 -match -match "^\[REPLACE.*LINE\]$" 的内容,但我不知道如何将其转换为 -replace 才能仅替换第一部分和最后一部分保持中间原样......

标签: regex powershell replace


【解决方案1】:

我认为您需要使用“^”来验证行首,而“$”将处理行尾。我已经用 Java 编写了代码,但你可以使用这个正则表达式。

String input="[REPLACE_IN_THIS_LINE]"
Pattern Pat=Pattern.compile(("^(\\[REPLACE)(.)*(LINE\\])$"));
Matcher Mat=Pat.matcher();
if(Mat.find())
{
    input=input.replace("[REPLACE","Enjoy").replace("LINE]","Life")
}

【讨论】:

  • 如果我理解正确,您可以分两步进行:1.检查字符串是否与模式匹配 2.替换需要替换的内容。
  • 是的,我尝试使用这个解决方案来解决这个问题。
【解决方案2】:

您必须调用 replace 2 次,每个要替换的字符串一次,考虑到您使用循环访问每一行,您必须执行以下操作:

$ResultText = $line.replace("[REPLACE","ENJOY").replace("LINE]","LIFE")

编辑:我误解了这个问题,我不认为您可以在文本中间添加“[REPLACE”。请尝试以下操作:

'[REPLACE_IN_THIS_LINE][REPLACE' -replace '^\[REPLACE(.*?)', 'ENJOY$1'

然后:

'[REPLACE_IN_THIS_LINE][REPLACE_LINE]' -replace '(.+?)LINE\]$', '$1LIFE'

如您所见,第一个仅替换第一个“[REPLACE”,第二个仅替换第一个“LINE]”。

【讨论】:

  • 这是不正确的。这将替换每个[REPLACELINE],这不是我想做的。无论如何,谢谢你的回答。
  • @JasminStarvors 对不起,我已经编辑了我的答案,看看它是否是你需要的。问候
【解决方案3】:

试试这样的:

Get-Content "C:\temp\test.txt" |%{

    if ($_ -like 'ENJOY*LIFE')
    {
      "[REPLACE{0}LINE]" -f $_.Substring(5, $_.Length -9)
    }
    else
    {
        $_
    }


} | Set-Content "c:\temp\result.txt"

【讨论】:

    【解决方案4】:

    使用组占位符(例如$1),参见例如:Powershell regex group replacing

    # $a = Get-Content .\Input.txt
    $a = "[REPLACE_IN_THIS_LINE]",
         "[DO_NOT_REPLACE_IN_THIS_LINE_PLEASE]",
         "[REPLACE_VERY_MUCH_IN_THIS_LINE]",
         "Do not replace in this line[REPLACE_IN_THIS_LINE]"
    

     

    $a -Replace '^\[REPLACE(.*)LINE\]$', 'ENJOY$1LIFE'
    

    【讨论】:

      【解决方案5】:

      只需尝试字符串替换功能。

      在 Java 中

      String inputValue="[REPLACE_IN_THIS_LINE]".replaceAll("[REPLACE","Enjoy").replaceAll("LINE]","Life");
      

      【讨论】:

        猜你喜欢
        • 2021-12-19
        • 1970-01-01
        • 2014-03-22
        • 1970-01-01
        • 2010-12-12
        • 1970-01-01
        • 1970-01-01
        • 2010-11-07
        • 2016-01-19
        相关资源
        最近更新 更多