這是一個示例:
: [
{
"yearGroupId": 13,
"educationPhaseEnum": 2,
"name": "Year Group 12",
"label": "YG 12"
},
{
"yearGroupId": 14,
"educationPhaseEnum": 2,
"name": "Year Group 13",
"label": "YG 13"
}
]
我想洗掉換行符和所有引號。我只想在字串 ': [' 和 ' ]' 之間執行此操作。所以所需的輸出如下所示:
[ { yearGroupId: 13, educationPhaseEnum: 2, name: Year Group 12, label: YG 12 }, { yearGroupId: 14, educationPhaseEnum: 2, name: Year Group 13, label: YG 13 } ]
我試過了Powershell -NoProfile "(Get-Content -Raw .\allacts.txt) -replace '(?<=\u003a\u0020\u005b).*[\n\r\u0022].*(?=\u0020\u0020\u0020\u0020\u005d)', '' | Out-File -FilePath allacts.txt -Force -Encoding ASCII"
還有大約一百件事……但我無法理解它的作業原理。我需要做什么才能讓 Powershell 在這些范圍內替換這些字符?在檔案的其他地方,我需要換行符。
謝謝。
編輯:是的,這是 JSON 資料。問題是有重復的鍵(我無法更改)。將其轉換為 CSV 結果 Powershell 忽略重復鍵并選擇其中一個進入輸出 CSV。直接將 JSON 匯入 Excel(我需要它去的地方)會導致 Excel 拒絕它,因為它無法處理重復的鍵。
因此,我決定將所有內容都歸為一個值,并在另一端使用 Power Query 對其進行排序(使用逗號作為分隔符)。
uj5u.com熱心網友回復:
您的任務需要動態 -replace操作操作,Windows PowerShell ( powershell.exe) - 與PowerShell (Core) 7 ( pwsh) 不同 - 無法直接提供:
您需要在輸入檔案中識別感興趣的塊...
...然后僅對該塊執行所需的轉換。
更新:正如Wiktor 的回答所示,使用環視斷言的非動態單-replace操作解決方案- 正如您所嘗試的那樣 - 是可能的 - 但它們有點令人費解。
此答案更詳細地討論了動態替換,但適用于您的情況,這意味著(假設您是從 PowerShell 外部呼叫,例如從cmd.exe/ 批處理檔案):
powershell.exe -NoProfile -c "[regex]::Replace((Get-Content -Raw .\allacts.txt), '(?s): \[. ?\r?\n \]', { param($match) $match.Value -replace '[\r\n\"]' }) | Out-File -FilePath allacts.txt -Force -Encoding ASCII"
有關作為第二個引數傳遞給的塊匹配正則運算式的解釋
[regex]::Replace()以及對其進行試驗的能力,請參閱此 regex101.com 頁面。第 3 個引數中使用的正則運算式,即動態替換腳本塊 (
{ ... }),是[\r\n"],它匹配所有 CR (\r)、LF (\n) 和"字符,并且由于它在-replace沒有替換運算元的情況下使用,因此有效地洗掉了它們。
uj5u.com熱心網友回復:
您可以使用兩種純字串模式正則運算式替換中的任何一種:
(Get-Content -Raw .\allacts.txt) -replace '(?s)(?<=: \[.*?)[\r\n"](?=.*? ])' | Out-File -FilePath allacts.txt -Force -Encoding ASCII
請參閱此正則運算式演示。詳情:
(?s)-RegexOptions.Singleline可以.匹配任何字符,包括換行符(?<=: \[.*?)- 一個正向的lookbehind,匹配一個緊跟在字串前面的位置,: [然后是盡可能少的零個或多個字符[\r\n"]- CR、LF 或"字符(?=.*? ])- 一個積極的前瞻,確保盡可能少的零個或多個字符,緊跟]在當前位置右側的空格 字符。
或者,如果您有: [.."...".: [ ... ]類似的字串,并且您只想洗掉最接近的字符之間的字符: [, ]您將需要使用
(Get-Content -Raw .\allacts.txt) -replace '(?s)(?<=: \[(?:(?!: \[).)*?)[\r\n"](?=.*? ])' | Out-File -FilePath allacts.txt -Force -Encoding ASCII
請參閱此正則運算式演示(請參閱背景關系選項卡)。詳情:
(?s)-RegexOptions.Singleline可以.匹配任何字符,包括換行符(?<=: \[(?:(?!: \[).)*?)- 與緊接在其前面的位置相匹配的正向回溯: \[-: [字串(?:(?!: \[).)*?: [- 任何不啟動字符序列的字符,零個或多個但盡可能少的次數
[\r\n"]- CR、LF 或"字符(?=.*? ])- 一個積極的前瞻,確保盡可能少的零個或多個字符,緊跟]在當前位置右側的空格 字符。
匹配項在此處被洗掉。
要么,
(Get-Content -Raw .\allacts.txt) -replace '(?s)(\G(?!^)|: \[)(.*?)[\r\n"](?=.*? ])', '$1$2' | Out-File -FilePath allacts.txt -Force -Encoding ASCII
要么
(Get-Content -Raw .\allacts.txt) -replace '(?s)(\G(?!^)|: \[)((?:(?!: \[).)*?)[\r\n"](?=.*? ])', '$1$2' | Out-File -FilePath allacts.txt -Force -Encoding ASCII
請參閱此正則運算式演示(不要忘記單擊此處的背景關系選項卡)。這里
(?s)-.現在匹配任何字符(\G(?!^)|: \[)- 第 1 組 ($1):上一個匹配或: [字串的結尾((?:(?!: \[).)*?)- 第 2 組 ( ):任何不啟動字符序列$2的字符,零個或多個,但次數盡可能少: [[\r\n"]- CR、LF 或"(?=.*? ])- 檢查]右側某處是否有空格 。
在這種情況下,匹配項將替換為組 1 組 2 值。
如果您要匹配任何(數量的)空格,請將模式中的文字空格替換為\s*(零個或多個空格)或(一個或多個空格)。\s
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/428284.html
標籤:正则表达式 电源外壳 批处理文件 分隔符 powershell-5.1
上一篇:將變數傳遞給下標
