【问题标题】:Replace file text between two words across multiple lines跨多行替换两个单词之间的文件文本
【发布时间】:2019-04-02 13:13:55
【问题描述】:

给定一个文本文件,我想替换两个给定单词之间的所有文本(跨多行)。

文本文件示例:

第1行 线2 XstartX 第 4 行 XendX 第 5 行

如果我想用YYY 替换startend 之间的所有文本 结果文件应该是

第1行 线2 XstartYYYendX 第 5 行

我试过了

$file='C:\Path\to\file.txt'

$raw = Get-Content $file -Raw
$raw -ireplace '(?<=start).+?(?=end)', 'YYY'
$raw | Set-Content $file

但是...没有运气!

【问题讨论】:

  • 试试$raw -ireplace '(?sm)(?&lt;=start).+?(?=end)', 'YYY' 您还需要将更改后的值设置为var,此时您刚刚输出到屏幕。
  • 它有效!我错过了(?sm),请您解释并回答,以便我选择它作为正确答案?
  • 我还注意到我遗漏了一些东西......脚本的第 4 行应该是 $raw = $raw -ireplace '(?sm)(?&lt;=start).+?(?=end)', 'YYY'
  • (?s) 就足够了。 . 通常不匹配换行符,因此如果没有 (?s) 修饰符,您的表达式将不会匹配多行文本。或者,您可以使用 [\s\S]+? 而不是 .+? 来匹配任何字符(包括换行符)。
  • 真的,(?s) 就够了! . 即使有多行也能正常工作

标签: regex powershell replace


【解决方案1】:

如 cmets 中所述,您需要启用 s 修饰符以使 .+?part 也匹配换行符。
正如 Ansgar 提到的,m 在这里不是必需的,但可以通过锚定以(?&lt;=^xstart) 开头的行来增强start

$file='C:\Path\to\file.txt'
$raw = Get-Content $file -Raw
$raw = $raw -ireplace '(?s)(?<=start).+?(?=end)', 'YYY'
$raw | Set-Content $file

或者

$file='C:\Path\to\file.txt'
$raw = (Get-Content $file -Raw) -ireplace '(?s)(?<=start).+?(?=end)', 'YYY'
$raw | Set-Content $file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    相关资源
    最近更新 更多