Powershell 替换使用正则表达式匹配以一串括号开头的行
Powershell replace using regex to match a row starting with a string of brackets
我正在尝试创建一个 powershell 脚本来修改文件并用逗号替换以“][”开头的行。
我有一个文件 text.json,其中有些损坏 JSON,如下所示:
[
{
"Id": "5413146",
"Datasets": [
{
"DatasetId": "354843154864",
"DatasetName": "testset"
}
],
"SharingAction": "Direct"
}
][][][][][
{
"Id": "656156462",
"LastRefreshTime": "may"
}
][][
{
"Id": "32448542",
"LastRefreshTime": "jan"
}
]
要修复它,我需要用逗号替换带有多个括号的行,我需要使用强大的 shell 脚本来完成。
我发现我可以将文件的内容读取到这样的变量中:
$text = Get-Content text.json -Raw
然后我可以替换普通文本并将修改后的内容输出到一个新文件,如下所示:
$text -replace 'may','june' | Out-File -FilePath text_modified.json
但是,我在使用正则表达式将行与括号匹配时遇到问题。
我发现匹配以“][”开头的行的正则表达式是这样的:
^]\[.*
我用两个不同的在线正则表达式验证器进行了测试,它似乎工作正常。那么我相信我正在寻找的命令应该是:
$text -replace '^]\[.*',',' | Out-File -FilePath text_modified.json
它不会取代任何东西。似乎它没有正确匹配括号。
$text -match ']'
returns 是的,但是当我尝试 $text -match '^]'
时 returns 是错的。我也试过 '^\]'
也 returns False.
有什么想法吗?感谢您的帮助。
Get-Content
returns 的 -Raw
参数是单个字符串,而不是表示文件中每一行的字符串数组。您当前的表达式实际上是在查找输入开头的模式,或者在本例中,文件开头.
如果删除 -Raw
,-replace
将改为对文件的每一行进行操作,并且每一行都将被处理 作为其自己的输入 。这意味着现在您在输入开头查找 ^]\[.*
的模式现在将在正确的行上匹配。
当然,Out-File
会将您更改的文件内容写入磁盘。
如果您真的想使用 -Raw
,如评论中所述,您可以在模式前加上
(?m)
。这是 多行模式 的 .NET 正则表达式修饰符。基本上,这个修饰符使 ^
和 $
匹配 line 的开始和结束,而不仅仅是 input[= 的开始和结束35=].
我正在尝试创建一个 powershell 脚本来修改文件并用逗号替换以“][”开头的行。
我有一个文件 text.json,其中有些损坏 JSON,如下所示:
[
{
"Id": "5413146",
"Datasets": [
{
"DatasetId": "354843154864",
"DatasetName": "testset"
}
],
"SharingAction": "Direct"
}
][][][][][
{
"Id": "656156462",
"LastRefreshTime": "may"
}
][][
{
"Id": "32448542",
"LastRefreshTime": "jan"
}
]
要修复它,我需要用逗号替换带有多个括号的行,我需要使用强大的 shell 脚本来完成。
我发现我可以将文件的内容读取到这样的变量中:
$text = Get-Content text.json -Raw
然后我可以替换普通文本并将修改后的内容输出到一个新文件,如下所示:
$text -replace 'may','june' | Out-File -FilePath text_modified.json
但是,我在使用正则表达式将行与括号匹配时遇到问题。
我发现匹配以“][”开头的行的正则表达式是这样的:
^]\[.*
我用两个不同的在线正则表达式验证器进行了测试,它似乎工作正常。那么我相信我正在寻找的命令应该是:
$text -replace '^]\[.*',',' | Out-File -FilePath text_modified.json
它不会取代任何东西。似乎它没有正确匹配括号。
$text -match ']'
returns 是的,但是当我尝试 $text -match '^]'
时 returns 是错的。我也试过 '^\]'
也 returns False.
有什么想法吗?感谢您的帮助。
Get-Content
returns 的 -Raw
参数是单个字符串,而不是表示文件中每一行的字符串数组。您当前的表达式实际上是在查找输入开头的模式,或者在本例中,文件开头.
如果删除 -Raw
,-replace
将改为对文件的每一行进行操作,并且每一行都将被处理 作为其自己的输入 。这意味着现在您在输入开头查找 ^]\[.*
的模式现在将在正确的行上匹配。
当然,Out-File
会将您更改的文件内容写入磁盘。
如果您真的想使用 -Raw
,如评论中所述,您可以在模式前加上 (?m)
。这是 多行模式 的 .NET 正则表达式修饰符。基本上,这个修饰符使 ^
和 $
匹配 line 的开始和结束,而不仅仅是 input[= 的开始和结束35=].