23

Powershell を使用して、次のスニペットのように、正規表現を使用してファイル内の複雑な文字列を検索し、それを固定値に置き換える方法を知っています。

Get-ChildItem  "*.txt" |
Foreach-Object {
    $c = ($_ | Get-Content)
    $c = $c -replace $regexA,'NewText'
    [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}

今、正規表現の各一致のサブセクションを置き換える方法を見つけようとしています。これは上記のように 1 つのスムーズなステップで実行できますか? または、より大きな正規表現の各一致を抽出し、その中で検索して置換し、その結果を元のテキストに貼り付ける必要がありますか?

例で明確にするために、次のテスト テキストで、次のテキストの「TEST=*1404」のような 14xx 番号のインスタンスのみを検索し、14xx を 16xx に置き換えたいとします。

A 2180 1830 12 0 3 3 TEST=C1404
A 900 1830 12 0 3 3 TEST=R1413
A 400 1830 12 0 3 3 TEST=R1411
A 1090 1970 12 0 3 3 TEST=U1400
A 1090 1970 12 0 3 3 TEST=CSA1400
A 1090 1970 12 0 3 3 TEST=CSA1414
A 1090 1970 12 0 3 3 TEST=CSA140
A 1090 1970 12 0 3 3 TEST=CSA14001
A 1090 1970 12 0 3 3 TEST=CSA17001

つまり、結果のテキストを次のようにしたいと思います。最初の 6 行だけを変更する必要があることに注意してください。

A 2180 1830 12 0 3 3 TEST=C1604
A 900 1830 12 0 3 3 TEST=R1613
A 400 1830 12 0 3 3 TEST=R1611
A 1090 1970 12 0 3 3 TEST=U1600
A 1090 1970 12 0 3 3 TEST=CSA1600
A 1090 1970 12 0 3 3 TEST=CSA1614 <- Second instance of '14' shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA140 <- Shorter numbers shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA14001 <- Longer numbers shouldn't change
A 1090 1970 12 0 3 3 TEST=CSA17001

replace次の正規表現は、置換が必要な大きな文字列を見つける仕事をしているようですが、結果の部分文字列を置き換えるために Powershell (?)のどの機能を使用すればよいかわかりません。また、それが役立つ場合は、より良い正規表現を提案してください。

$regexA = "\bTEST=\b[A-Za-z]+14\d\d\r"

「R」、「C」、「CSA」など、「=」と数字の間に入る可能性のあるものの完全なリストをハードコーディングする必要はありません。

正規表現のすべての一致を取得し、それらの中を検索して 14 を 16 に置き換え、元のテキストに対して古い値と新しい値で置換を実行しますreplace($myText,"TEST=CSA1400","TEST=CSA1600")。特殊なケースをうまくカバーできず、うさぎの穴に向かっているように感じます。

4

3 に答える 3

32

保持したい部分式をグループ化して (つまり、括弧で囲んで)、変数$1を介し$2て置換文字列でグループを参照する必要があります。次のようなことを試してください:

$regexA = '( TEST=[A-Za-z]+)14(\d\d)$'

Get-ChildItem '*.txt' | ForEach-Object {
    $c = (Get-Content $_.FullName) -replace $regexA, '${1}16$2' -join "`r`n"
    [IO.File]::WriteAllText($_.FullName, $c)
}
于 2013-11-11T22:30:14.223 に答える