powershell regexp取代* [('任何字符''左括号']并替换为*`n [('任何字符'''& 39;'左括号')

时间:2014-08-17 02:13:50

标签: regex powershell

我的脚本效果很好。

$files = @(get-childitem -include *.txt -recurse -path $path -filter $filter)
Write-Host "files loaded";
foreach ($file in $files) {
    $out1Pass = "$file" + ".1pass"
    $outFile = "$file" + "2"

    Get-Content $file | Foreach-object {
        $_ -replace "`t","" `
        -replace '\]\[',"]`r`n["
    } | Set-Content $outFile 
}   

但如果不是,它会更好     -replace'] [',“] r n [”

我可以做点什么     -replace'* [',“ r n [” and -replace '\]\*',"] r`n

if *表示任何字符。

但是......唉,这样的格式不起作用。

输入与输出的样本

输入:

reaction_other

[OBJECT:REACTION]

[REACTION:TAN_A_HIDE]
    [NAME:tan a hide]
    [BUILDING:TANNER:CUSTOM_T]
    [REAGENT:A:1:NONE:NONE:NONE:NONE][USE_BODY_COMPONENT][UNROTTEN]
        [HAS_MATERIAL_REACTION_PRODUCT:TAN_MAT]

输出:

reaction_other

[OBJECT:REACTION]

[REACTION:TAN_A_HIDE]
[NAME:tan a hide]
[BUILDING:TANNER:CUSTOM_T]
[REAGENT:A:1:NONE:NONE:NONE:NONE]
[USE_BODY_COMPONENT]
[UNROTTEN]
[HAS_MATERIAL_REACTION_PRODUCT:TAN_MAT]

更新 好的,我试过你的剧本。它比我原来的更好。但是,还有一个小问题。

以下是显示问题的示例数据:

输入:

item_gloves

[OBJECT:ITEM]

###test###[ITEM_GLOVES:ITEM_GLOVES_GAUNTLETS][NAME:gauntlet:gauntlets]###TEST[ARMORLEVEL:2]
[UPSTEP:1]
[SHAPED]
[LAYER:ARMOR]
[COVERAGE:100]
[LAYER_SIZE:20]
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[LEATHER]
[HARD]

输出:

item_gloves

[OBJECT:ITEM]

###test###[ITEM_GLOVES:ITEM_GLOVES_GAUNTLETS]
[NAME:gauntlet:gauntlets]###TEST
[ARMORLEVEL:2]
[UPSTEP:1]
[SHAPED]
[LAYER:ARMOR]
[COVERAGE:100]
[LAYER_SIZE:20]
[LAYER_PERMIT:15]
[MATERIAL_SIZE:2]
[SCALED]
[BARRED]
[METAL]
[LEATHER]
[HARD]

1 个答案:

答案 0 :(得分:2)

$inputText = @"
reaction_other

[OBJECT:REACTION]

[REACTION:TAN_A_HIDE]
    [NAME:tan a hide]
    [BUILDING:TANNER:CUSTOM_T] ## Some comment here
    [REAGENT:A:1:NONE:NONE:NONE:NONE] # Here [USE_BODY_COMPONENT] ## Inline comment [UNROTTEN]
        [HAS_MATERIAL_REACTION_PRODUCT:TAN_MAT]
"@

$outputText = $inputText -replace '(?m)^\s*','' `
              -replace '(\[.+?\][^\[\r\n]*)(?=\[)' , "`$1`r`n"

如何运作

它仍在2 -replace中完成。

替换1:

第一个-replace删除所有前导空格:

  1. (?m)是内联正则表达式模式说明符,其中m代表"多行"它有效地使^$匹配每一行的开头和结尾,而不是整个字符串的开头和结尾。
  2. 因此,
  3. ^匹配每行的开头。
  4. \s是一个代表大多数空格的字符类,包括空格和制表符。
  5. *表示零或更多。
  6. 如此有效地说:

      

    用空字符串替换每行开头的所有空格(有效地删除它)。

    替换2:

    1. 我们首先使用(打开一个捕获组。
    2. 接下来,我们将文字左括号与\[匹配,后跟一个或多个任何字符(非贪婪),后跟文字右括号\]
    3. 仍然在我们的捕获组中,我们使用[(未转义)启动角色类,在此上下文中^表示NOT,因此无论我们在课程中放置什么都必须不在场。
    4. 在字符类中,我们使用文字左括号\[,CR \r和LF \n,然后关闭班级]。我们使用*表示我们想要该类中的0个或更多。
    5. 捕获组现已关闭。
    6. 下一部分是一个积极的前瞻。它会查看是否存在特定匹配,但这里的关键部分是它不会消耗这些字符,因此它们不属于匹配项,因此它们不会被替换。
    7. 替换字符串是第一个捕获组的值,后跟CRLF。请注意双引号字符串。这要求我们使用反引号来转义$,以便powershell不会将$1解释为powershell变量。相反,文字$1字符串将被发送到正则表达式引擎,在那里它将被解释为反向引用。
    8. 所以这个替换基本上是在说:

        

      在方括号[*]内查找字符串,可选地后跟任意数量的非[或行结尾的文字。但是,如果匹配字符串后面有[只会将其视为匹配项。   如果满足所有条件,请将该字符串替换为自身,然后替换为CRLF。