【问题标题】:Regex - using "replace" to delete content using capture groups正则表达式 - 使用“替换”使用捕获组删除内容
【发布时间】:2019-10-19 00:12:25
【问题描述】:

我有一个包含地址信息的 CSV 文件,该文件偶尔会在字段中出现换行符。这导致我们的软件将其视为包含无效数据的两条单独的行。我的最终目标是创建一个可以从终端运行的单行 Powershell 命令来解决此问题,但是,在将捕获组带入等式时,我终生无法让“-replace”正常工作。

这是可以用“\r\n”捕获的带有行尾的数据文件:

"name1","address1","city1","state1","zip1"
"name2","address2
2ndline2","city2","state2","zip2"

这是我目前所拥有的(还不是 1 行 cmd 行格式):

((get-content "$local\$file" -raw) -replace '(?sm),"[^"]*(?<line>\r\n)[^"]*",', '''${line}<replace>''') `
-replace "<replace>","" | Set-Content "$local\test2.txt"

我在弄清楚如何将捕获组替换为空时遇到问题,因此我尝试将其替换为另一个字符串,然后我可以轻松删除该字符串。当我运行上述命令时,它会替换整个匹配项,而不仅仅是捕获组。我根据这里的另一个建议创建了这行代码:https://stackoverflow.com/a/29973460/6477292

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    如果您有 PowerShell Core v6.1 及更新版本,您可以使用

    (get-content "$local\$file" -raw) -replace ',"[^"\r\n]*\r\n[^"]*",', { $_.Value.Replace("`r`n", "") }
    

    ,"[^"\r\n]*\r\n[^"]*", 正则表达式匹配 ,",然后是除 "、CR 和 LF 之外的任何 0+ 字符,然后是 CRLF 序列,然后是除 " 之外的任何 0+ 字符,然后是 ,

    { $_.Value.Replace("rn", "") } 块接受匹配对象,并将 CRLF 序列替换为空字符串。

    在不支持替换-replace命令的可调用块的其他版本中,您只能通过显式使用[regex]对象来做到这一点:

    $regex = [regex]',"[^"\r\n]*\r\n[^"]*",'
    $callback = {  param($m) $m.Value.Replace("`r`n", "") }
    $newfilecontents = $regex.Replace($filecontents, $callback)
    

    【讨论】:

    • 我使用了 v6.1 之前的解决方案,效果非常好,感谢您的详尽回答!
    猜你喜欢
    • 2019-10-16
    • 2021-08-18
    • 2020-12-28
    • 2015-08-06
    • 1970-01-01
    • 2016-04-06
    • 1970-01-01
    • 1970-01-01
    • 2020-10-04
    相关资源
    最近更新 更多