none
PowerShellを用いて当該文字列を編集する方法。 RRS feed

  • 質問

  • 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文字ごとに改行されてしまうため、その先の処理が難しいのではと考えています。

    そもそものやり方も含め、どのように対応したら良いかご教授いただけないでしょうか。

    2021年3月16日 5:27

すべての返信

  • 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'


    2021年3月16日 6:32
  • 魔界の仮面弁士 様

    ご回答ありがとうございます。



    > これは JSON データとは呼べないですね。

    教えていただきありがとうございます。

    ご回答を基に指示元へ尋ねたところ、{}で閉じられた新しいファイルをいただくことができました。
    ("id",xxについては変わりがありませんでしたが。)


    コマンドについては新旧両方のファイルにおいて3行目でエラーが発生してしまう状況です。
    「このオブジェクトにプロパティ 'ips ' が見つかりません」という出力となっていますが、
    4行目の内容自体は処理されており、変換することができています。

    新しいファイルはフォーマットが異なってしまっており、状況が当初の質問の状況とは変わってしまいましたが、

    いただいた内容を基に対応可能な見込みとなりました。

    ご回答ありがとうございました。

    2021年3月17日 7:09
  • ご回答を基に指示元へ尋ねたところ、{}で閉じられた新しいファイルをいただくことができました。
    ("id",xxについては変わりがありませんでしたが。)

    最初のファイルは「"id":xx,」で今回は「"id",xx」だったのですか?
    それは変わりないどころか、全く別物ですね。

    『{"id":xx}』や『"id":xx,』は JSON として無効ですが、
    『{"id":"xx"}』『{"id":123}』『["id",123]』などは有効です。

    なお、JSON でデータ交換する場合のファイルのエンコードは、RFC 8259 において BOM 無しの UTF-8 で記述するもの(MUST)として定義されています。ただし外部システムとのやり取りの無い、閉鎖的なエコシステムにおいては、別のエンコードが用いられることもあります。

    2021年3月17日 7:57