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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

解決済

2回答

12230閲覧

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

Shoshinkun

総合スコア14

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

1クリップ

投稿2016/05/16 06:46

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までしか使えない状況となっております。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

試してみてください。

Powershell

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

投稿2016/06/06 11:34

編集2016/06/06 11:41
Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shoshinkun

2016/06/14 04:45

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

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/18 02:03

編集2016/05/18 02:05
K-iwata

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shoshinkun

2016/05/19 04:32

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

2016/05/19 07:37 編集

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

2016/05/30 07:30

コメントが付いていることを全く確認できておりませんでした。 大変申し訳ございません。 また、再度のご返信ありがとうございます。 詳述について細部の表現に誤りがありました。 「メールの開始文」という形容は間違っておりました。 実際には「データ部分を除くメールの開始文」になります。 ですので、プログラムの要望としてはメール内の文面の全文を置換したいのではなく、 正確には「メール内の特定の文言から始まり、中間はランダムな文字列があり、特定の文言で終わる文字列を置換したい」というものでした。 なんとかそれをReplaceの条件に指定しようとしても上手くいきませんでしたので、こちらでご質問させて頂きました次第です。 言葉が足らず本当に申し訳ございません。 何卒よろしくおねがい致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問