1

私はこれを持っています:

(gc "$env:a.txt") -replace 'aaa', 'bbb'

どうにかしてパイプしたいので、変更された行(変更後)とそれらだけを印刷します('bbb'もちろん、単に検索する必要はありません)。どのように ?

編集:

その過程でファイルを変更したいので、それが難しくなっていることを忘れました(ただし、「正気のフィードバック」として、更新された行のみを表示したい):

(gc "a.txt") -replace 'aaa', 'bbb' | something-here-?? | sc a.txt

それを2つのステップで行う必要がありますか、それともすべてをパイプする方法がありますか?

4

4 に答える 4

2

必要なものについて、何が変更されているかを示し、ファイルの内容を置き換えるには、次の操作を実行できます。

gc test.txt | %{ 
    if($_ -match "this") {
        $replaced = $_ -replace "this","that"
        write-host $replaced
        $replaced
    } else{
        $_
    }

} | sc test2.txt

交換後の差分を見たいだけなら、compare-object

于 2012-06-12T18:34:12.413 に答える
2

最初に置換するテキストと照合してから、1行ずつ置換することができます...

(gc a.txt) -match 'aaa' | % { $_ -replace 'aaa', 'bbb' }

また、あなたのコード、およびあなたのコードから派生した私のコードは、実際には元のファイルを変更しないことを指摘したいと思います。

于 2012-06-12T17:15:16.510 に答える
1

セスの方法を使わない理由はわかりませんが、何か微妙なことがある場合や、タイピングを楽しんでいる場合は、差分が組み込まれています。変更された線の変更された方向だけを取得するには:

  diff (gc myfile) ((gc myfile) -replace "x", "y")) |  % { if ($_.SideIndicator -eq '=>') { $_.InputObject } }

(SideIndicatorのテストを削除することで、origとchangedの両方を取得できます)

于 2012-06-12T17:30:08.837 に答える
1

ForEach-Objectを使用して、置き換えられた各値で新しい値を確認し、書き出すことができます。パイプラインにすべてを渡し続けるようにしてください。

(Get-Content "a.txt") -replace 'aaa', 'bbb' | 
    ForEach-Object { if( $_ -like '*bbb*' ) { Write-Host $_ } $_ } | 
    Set-Content a.txt

すでにbbbが含まれている行が表示されます。あなたが本当に前後を見たいだけなら:

Get-Content "a.txt" | 
    ForEach-Object {
         if( $_ -match 'aaa' ) 
         {
             $newLine = $_ -replace 'aaa','bbb'
             Write-Host "> $_"
             Write-Host "< $newLine"
             $newLine
         }
         else
         {
             $_
         }

    } |
    Set-Content a.txt
于 2012-06-12T19:30:27.083 に答える