【问题标题】:Delete substring from file to end of line从文件中删除子字符串到行尾
【发布时间】:2017-10-13 08:51:22
【问题描述】:

考虑文件dummy.txt,如下:

SomeMessage:“属性 'CLR' 的 BLABLABLA 值 'V1',附加信息:'Sometext'。” SomeMessage:“属性‘HGT’的 BLABLABLA 值‘W2’,附加信息:‘Sometextmore’。” SomeMessage:“属性 'SND' 的 BLABLABLA 值 'X3',附加信息:'EvenSomeBiggerBulk'。”

如何删除从", Additional Information" 开始到行尾的每一行中的每个子字符串?这样我得到以下结果:

SomeMessage:“属性 'CLR' 的 BLABLABLA 值 'V1' SomeMessage:“属性 'HGT' 的 BLABLABLA 值 'W2' SomeMessage:“属性 'SND' 的 BLABLABLA 值 'X3'

我试过了:

(Get-Content dummy.txt).Replace(', Additional*." ', '') | Set-Content temp.txt 

但这使文件保持不变。

【问题讨论】:

    标签: regex powershell wildcard


    【解决方案1】:

    你几乎是对的

    (Get-Content dummy.txt) -replace ", Additional.*" | Set-Content temp.txt 
    

    使用 PowerShell 运算符 -replace 代替 .NET 字符串方法 .Replace()

    .NET 方法接受两个字符串,oldValuenewValue,并且不使用正则表达式。它只能替换完全匹配。

    PowerShell 运算符也接受两个字符串,但它使用正则表达式。如果您只想删除匹配项,newValue 字符串是可选的。

    【讨论】:

    • *. ?你的意思是.* 吗? :)
    • 谢谢。以下解决方案工作正常:
       (Get-Content dummy.txt) -replace ", Additional.*" | Set-Content temp.txt  Howerver,有人可以解释为什么它是 .* 而不是 *.
    • @SamNorton in regex . 是“任意字符”,* 表示“重复前一个字符零次或多次”,因此您的 Additional*. 实际上是任意数量的字母 @ 987654335@ 重复,然后是任何一个字符,希望能解释它。
    • @ConnorLSW 感谢您的回答。
    【解决方案2】:

    我会去:

    (Get-Content dummy.txt) -replace (",\sAdditional.*", "") > temp.txt

    我更喜欢> 重定向器(管道也可以正常工作)。我已经改进了 regex 以匹配您正在搜索的内容。

    【讨论】:

    • @tukan , 不是正则表达式中的特殊字符,无需转义。 \s 并不比空格好,尤其是因为 OP 的文件只有一个空格。你说的正则表达式改进在哪里?
    • @Tomalak 您对, 的看法是正确的 - 将修复它。 \s 是空格的等价物,这也是正确的。改进是视觉上的,而不是功能性的。如果你有复杂的正则表达式,\s 比 ` ` 更容易发现
    • 但是当您进行非正则表达式替换时,您必须在搜索字符串中使用常规空格,并且很容易发现。在正则表达式中发现并不难。 :) 这是一个偏好问题,真的。
    • @Tomalak 这是完全正确的。由于我做了一些复杂的正则表达式,我只是有这个习惯,它从来没有咬过我:),所以我称之为改进。
    • 好吧,够公平的。
    猜你喜欢
    • 2010-10-10
    • 2010-11-05
    • 2011-03-07
    • 1970-01-01
    • 2015-01-11
    • 2020-09-03
    相关资源
    最近更新 更多