none
文字置換 RRS feed

  • 質問

  • お世話になります。

    下記は、最初のカンマの後に”ああ”足しているコマンドです。
    gc filename | %{$_ -replace '(^[0-9]*)(,)','$1$2ああ'}

    この置換文字のあとに$1$2の後に数値や変数を使用する方法がわかりません。

    ご教授ください。

    '$1$220010909'
    '$1$2$test'

    どちらも失敗します。

     

    2010年9月14日 10:28

回答

  • 変数を使う場合は正規表現の特殊変数に使われる文字「$」を「`」でエスケープし、''ではなく""で文字列を括ると良いと思います。

    例:

    gc filename | %{$_ -replace '(^[0-9]*)(,)',"`$1`$2$test"}

    特殊変数$1,$2...の後に数値を続けて書く方法はちょっと分かりませんが、この例だと正規表現を一部書き換えた上で、「$&」という「マッチした文字列」を格納する特殊変数を用いることで解決します。

    例:

    gc filename | %{$_ -replace '^[0-9]*,','$&20010909'}

    • 回答としてマーク TAKAKUN 2010年9月17日 3:54
    2010年9月14日 11:47
    モデレータ
  • >「$&」とはどういう意味なんでしょうか。確かに同じ結果になったのですが・・・

    「マッチした文字列全体」を意味します。

    たとえば"2222,3333"という文字列に"^[0-9]*,"という正規表現を適用すると、"2222,"という文字列がマッチします。そのため、「$&」には"2222,"が格納されます。

    >この「一般変数と同様に」のくだりがわかりません。

    PowerShellの変数名で使えない文字(数字など)も{}を使えば使えます。

    たとえば、

    ${1}=2

    とすると

    ${1}には「2」が格納されます。

    同様のことが正規表現の後方置換で使う特殊変数でも可能ということですね。

    すなわち、

    '${1}${2}20010909'
    "`${1}`${2}$test" ($testに数値が入っていてもOK)

    などが可能になるということです。これは私も知りませんでした。

    • 回答としてマーク TAKAKUN 2010年9月17日 3:54
    2010年9月15日 3:06
    モデレータ
  • > PowerShellの変数名で使えない文字(数字など)も{}を使えば使えます。

    微妙にニュアンスが違うかも?

    PowerShell では、変数名に様々な文字が使えますが、PowerShell は通常は文脈から変数名の終わりを自動的に判断します。

    たとえば、"$abc 3" と記載すると 「abc という変数、3 という文字」と判定されますが、"$abc3" と記載すると 「abc3 という変数」と判断されます。これを「変数名は abc までですよ」と明示するのが ${abc} という書き方です。"${abc}3" と記載すると「abc という変数、3 という文字」と判定されるようになります。

    最初の話にもどって、'$1$220010909' という記載をおこなった場合、PowerShell では「1 という変数」「220010909 という変数」と判定されますので、{ } を利用して '$1${2}20010909' と記載する必要があります。

    という話でした。

    同様に、変数名にスペースを含めたり演算する場合などにも { } による変数名の範囲の明示が利用できます。

    • 回答としてマーク TAKAKUN 2010年9月17日 3:54
    2010年9月15日 3:31

すべての返信

  • 変数を使う場合は正規表現の特殊変数に使われる文字「$」を「`」でエスケープし、''ではなく""で文字列を括ると良いと思います。

    例:

    gc filename | %{$_ -replace '(^[0-9]*)(,)',"`$1`$2$test"}

    特殊変数$1,$2...の後に数値を続けて書く方法はちょっと分かりませんが、この例だと正規表現を一部書き換えた上で、「$&」という「マッチした文字列」を格納する特殊変数を用いることで解決します。

    例:

    gc filename | %{$_ -replace '^[0-9]*,','$&20010909'}

    • 回答としてマーク TAKAKUN 2010年9月17日 3:54
    2010年9月14日 11:47
    モデレータ
  • > 数値を続けて書く方法は

    一般の変数と同様に ${1} や ${2} で問題なく展開されるみたいです。

    2010年9月14日 23:40
  • ご返事ありがとうございます。

    >gc filename | %{$_ -replace '^[0-9]*,','$&20010909'}

    「$&」とはどういう意味なんでしょうか。確かに同じ結果になったのですが・・・

    >一般の変数と同様に ${1} や ${2} で問題なく展開されるみたいです。

    この「一般変数と同様に」のくだりがわかりません。

    $a=100
    '${a}'

    とおもって試したのですが・・・

    教えてください。

     

    2010年9月15日 1:07
  • >「$&」とはどういう意味なんでしょうか。確かに同じ結果になったのですが・・・

    「マッチした文字列全体」を意味します。

    たとえば"2222,3333"という文字列に"^[0-9]*,"という正規表現を適用すると、"2222,"という文字列がマッチします。そのため、「$&」には"2222,"が格納されます。

    >この「一般変数と同様に」のくだりがわかりません。

    PowerShellの変数名で使えない文字(数字など)も{}を使えば使えます。

    たとえば、

    ${1}=2

    とすると

    ${1}には「2」が格納されます。

    同様のことが正規表現の後方置換で使う特殊変数でも可能ということですね。

    すなわち、

    '${1}${2}20010909'
    "`${1}`${2}$test" ($testに数値が入っていてもOK)

    などが可能になるということです。これは私も知りませんでした。

    • 回答としてマーク TAKAKUN 2010年9月17日 3:54
    2010年9月15日 3:06
    モデレータ
  • > PowerShellの変数名で使えない文字(数字など)も{}を使えば使えます。

    微妙にニュアンスが違うかも?

    PowerShell では、変数名に様々な文字が使えますが、PowerShell は通常は文脈から変数名の終わりを自動的に判断します。

    たとえば、"$abc 3" と記載すると 「abc という変数、3 という文字」と判定されますが、"$abc3" と記載すると 「abc3 という変数」と判断されます。これを「変数名は abc までですよ」と明示するのが ${abc} という書き方です。"${abc}3" と記載すると「abc という変数、3 という文字」と判定されるようになります。

    最初の話にもどって、'$1$220010909' という記載をおこなった場合、PowerShell では「1 という変数」「220010909 という変数」と判定されますので、{ } を利用して '$1${2}20010909' と記載する必要があります。

    という話でした。

    同様に、変数名にスペースを含めたり演算する場合などにも { } による変数名の範囲の明示が利用できます。

    • 回答としてマーク TAKAKUN 2010年9月17日 3:54
    2010年9月15日 3:31
  • 皆様ご返事ありがとうございます。

    勉強になりました。

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

    2010年9月17日 3:54