我的脚本效果很好。
$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]
答案 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
中完成。
第一个-replace
删除所有前导空格:
(?m)
是内联正则表达式模式说明符,其中m
代表"多行"它有效地使^
和$
匹配每一行的开头和结尾,而不是整个字符串的开头和结尾。^
匹配每行的开头。\s
是一个代表大多数空格的字符类,包括空格和制表符。*
表示零或更多。如此有效地说:
用空字符串替换每行开头的所有空格(有效地删除它)。
(
打开一个捕获组。\[
匹配,后跟一个或多个任何字符(非贪婪),后跟文字右括号\]
。[
(未转义)启动角色类,在此上下文中^
表示NOT
,因此无论我们在课程中放置什么都必须不在场。\[
,CR \r
和LF \n
,然后关闭班级]
。我们使用*
表示我们想要该类中的0个或更多。$
,以便powershell不会将$1
解释为powershell变量。相反,文字$1
字符串将被发送到正则表达式引擎,在那里它将被解释为反向引用。所以这个替换基本上是在说:
在方括号
[*]
内查找字符串,可选地后跟任意数量的非[
或行结尾的文字。但是,如果匹配字符串后面有[
,只会将其视为匹配项。 如果满足所有条件,请将该字符串替换为自身,然后替换为CRLF。