質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.36%

PowerShell2.0で正規表現でのReplaceの条件指定がうまくいきません

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 9,776

Shoshinkun

score 14

PowerShell2.0で、テキストファイルの中の複数行の文字列を置換したいのですが、
目標の複数行をうまく指定できずに困っております。
たとえば、

111
222
333

または

111
aaa
333

というパターンの文字列がある場合、正規表現などを用いていずれの複数行の文字列も置換対象に含めたいのですが、
下記の書き方ではできませんでした。

$filePath = "xxx.txt"
$input = '(?s:111.*333)';
$replacement = '000';
$fileContent -replace $input, $replacement | Out-File -FilePath $filePath -Encoding default | Out-Null

都合上、今はPowerShellのバージョンは2.0までしか使えない状況となっております。

何卒よろしくおねがいします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

試してみてください。

$content = Get-Content xxx.txt
$expression = "111.*333"
$result = "000"
[System.Text.Regularexpressions.Regex]::Replace(([string]::Join("`n", $content)), $expression, $result, "Singleline")

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/06/14 13:45

    遅くなりまして申し訳ございませんでした。
    うまくReplaceの対象にかけることが出来ました。
    どうもありがとうございました。
    また何かありましたら、何卒どうぞよろしくおねがい致します。

    キャンセル

0

置換したい文字条件がよくわからないので、やりたいことがあっているのかわかりませんが、
以下の方法でいけませんか?

$inputFile = "xxx.txt"
$BeforeWord = "[1,2,3,a]"
$AfterWord = "0"
Get-Content $inputFile | foreach {$_ -replace $BeforeWord , $AfterWord}

上記の方法で、1も2も3もaも全て0に置換され、これら以外は置換されませんがいかがですか。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/05/19 13:32

    ありがとうございます。
    申し訳ありません、書き方を誤りました。
    「111」や「333」などの事例の数字は、実際にはメールの開始文と終了文の文面です。
    「お世話になっております」で開始し、そののち複数行の不特定の文言が入り、「失礼致します」で終了する文章です。
    不特定の文言部分は日々変わるのでなにが入るかわかりませんが、開始と終了の部分は常に決まっています。
    これら開始から終了までを含む全文を「問題なし」という文言に自動的にReplaceしたいのが目的でした。
    何卒よろしくおねがいします。

    キャンセル

  • 2016/05/19 16:25 編集

    なるほど、そのような置換条件だったのですね。であれば、文字の種類は関係ないと思いますので、少々要件を変えて、以下の要件でスクリプトを作ってみましたが、いかがですか?

    <要件>
    Aファイルを先頭行から読み込んでいき、何か文字が入っている場合は、
    「問題なし」という文字をBファイルへ出力し、空白行の場合は、空白行を同じくBファイルへ出力する。(ただしスペースは文字としてカウント)
    AファイルとBファイルを比較した場合、両方とも同じ行に文字が記載してある。

    #変数設定
    $Input = "AAAA.txt"
    $Output = "BBBB.txt"
    $OutputWord01 = "問題なし"
    $OutputWord02 = ""
    $Datas = Get-Content $Input

    #メイン処理
    foreach ($Data in $Datas) {
    if ($Data) {
    $Outputword01 | Out-File $Output -Encoding default -Append
    } else {
    $OutputWord02 | Out-File $Output -Encoding default -Append
    }
    }

    キャンセル

  • 2016/05/30 16:30

    コメントが付いていることを全く確認できておりませんでした。
    大変申し訳ございません。
    また、再度のご返信ありがとうございます。

    詳述について細部の表現に誤りがありました。
    「メールの開始文」という形容は間違っておりました。
    実際には「データ部分を除くメールの開始文」になります。

    ですので、プログラムの要望としてはメール内の文面の全文を置換したいのではなく、
    正確には「メール内の特定の文言から始まり、中間はランダムな文字列があり、特定の文言で終わる文字列を置換したい」というものでした。

    なんとかそれをReplaceの条件に指定しようとしても上手くいきませんでしたので、こちらでご質問させて頂きました次第です。
    言葉が足らず本当に申し訳ございません。

    何卒よろしくおねがい致します。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.36%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る