質問者
PowerShellを用いて当該文字列を編集する方法。

質問
-
PowerShellを用い以下のようなjson形式の文字列から
IPv6を削除しつつIPv4アドレス行の末尾カンマを除きたいのですが
上手くできずご助力いただけないでしょうか。
<対象文字列>
example.txt
--------------------------------------
"id":xx,
"serviceArea":"yy",
"serviceAreaDisplayName":"zz",
"urls":[
"portal.microsoftonline.com"
],
"ips":[
"192.168.0.1/32",
"192.168.10.1/32",
"fe80::1/128",
"fe80::2/128"
],
-------------------------------------
<実現したい形>
--------------------------------------
"id":xx,
"serviceArea":"yy",
"serviceAreaDisplayName":"zz",
"urls":[
"portal.microsoftonline.com"
],
"ips":[
"192.168.0.1/32",
"192.168.10.1/32"
],
-------------------------------------
個人としてはbashでいうところの
xxdコマンドによるダンプ→sedなどでの編集→xxdコマンドによる再構築のような流れを考えており
現状、以下のコマンドラインを実行しIPv6アドレスまでは除けているのですが、
IPv4アドレスの最終行のカンマを除くことができず困っております。
<投入コマンドライン>
---------------------------------
Get-Content .\example.txt | % { $_ -replace "`"[0-9,a-f,A-F]{4}:(([0-9,a-f,A-F]{0,4}:{1,}){1,})[^\.]+`",?","" } | ? { $_ -ne "" } | out-string | % { [system.text.encoding]::ASCII.getbytes($_) } | % { [system.convert]::tostring($_,16) }
---------------------------------
PowerShellでは.net Frameworkのメソッド(処理?クラス?)を利用することができるのはわかったのですが、
後続のコマンドで%を用いない場合エラーとなってしまい、上記のように%を用いた場合でも
1文字ごとに改行されてしまうため、その先の処理が難しいのではと考えています。
そもそものやり方も含め、どのように対応したら良いかご教授いただけないでしょうか。
すべての返信
-
PowerShellを用い以下のようなjson形式の文字列から
末尾が「,」で終わっていますので、これは JSON データとは呼べないですね。
先頭の「{」と末尾の「}」も無いですし、冒頭の「"id":xx,」も構文エラーです。
元データが正しい JSON ファイルなのだとしたら、ConvertFrom-Json / ConvertTo-Json を使えるかもしれません。
$js = Get-Content 'D:\Example.txt' -raw $jo = ConvertFrom-Json $js $jo.ips = ($jo.ips | Where-Object { $_ -notlike '*:*' }) ConvertTo-Json $jo | Out-File -FilePath 'D:\Example-Out.txt'
- 編集済み 魔界の仮面弁士MVP 2021年3月16日 6:33
-
魔界の仮面弁士 様
ご回答ありがとうございます。
> これは JSON データとは呼べないですね。
教えていただきありがとうございます。
ご回答を基に指示元へ尋ねたところ、{}で閉じられた新しいファイルをいただくことができました。
("id",xxについては変わりがありませんでしたが。)
コマンドについては新旧両方のファイルにおいて3行目でエラーが発生してしまう状況です。
「このオブジェクトにプロパティ 'ips ' が見つかりません」という出力となっていますが、
4行目の内容自体は処理されており、変換することができています。
新しいファイルはフォーマットが異なってしまっており、状況が当初の質問の状況とは変わってしまいましたが、
いただいた内容を基に対応可能な見込みとなりました。
ご回答ありがとうございました。
-
ご回答を基に指示元へ尋ねたところ、{}で閉じられた新しいファイルをいただくことができました。
("id",xxについては変わりがありませんでしたが。)最初のファイルは「"id":xx,」で今回は「"id",xx」だったのですか?
『{"id":xx}』や『"id":xx,』は JSON として無効ですが、
それは変わりないどころか、全く別物ですね。
『{"id":"xx"}』『{"id":123}』『["id",123]』などは有効です。
なお、JSON でデータ交換する場合のファイルのエンコードは、RFC 8259 において BOM 無しの UTF-8 で記述するもの(MUST)として定義されています。ただし外部システムとのやり取りの無い、閉鎖的なエコシステムにおいては、別のエンコードが用いられることもあります。