PowerShellの勉強の続きです。今回は文字操作を勉強してみました。いつものとおり、忘れないようにメモを残します。
#文字列の分割
文字列を区切り記号,
で分割します。
'Jan,Feb Mar,Apr'.split(',')
Jan
Feb Mar
Apr
複数の区切り記号をカンマ,
と空白
として分割します。
'Jan,Feb Mar,Apr'.split(', ')
Jan
Feb
Mar
Apr
分割数を指定します。
'Jan,Feb Mar,Apr'.split(', ',3)
Jan
Feb
Mar,Apr
正規表現を使う場合は-split
を使います。
'Jan,Feb Mar,Apr' -split '[,\s]',3
Jan
Feb
Mar,Apr
区切り記号を2文字以上にする場合も正規表現を使います。
"abc`r`ndef" -split "`r`n" #PowerShellではエスケープに"\"ではなく"`"を使います。
abc
def
#文字の前後の空白の削除
Trim
を使い、文字の前後の空白を取り除くことができます。
' Hello , World ! '.Trim()
Hello , World !
配列では全要素に対し空白の削除が行われる。
' Hello , World ! '.split(',').Trim()
Hello
World !
#全角・半角変換
文字を半角に変換するには[VbStrConv]::Narrow
を、全角に変換するには[VbStrConv]::Wide
を使います。
using namespace Microsoft.VisualBasic
Add-Type -AssemblyName 'Microsoft.VisualBasic'
[Strings]::StrConv('PowerShell',[VbStrConv]::Narrow)
[Strings]::StrConv('Windows',[VbStrConv]::Wide)
PowerShell
Windows
#置き換え
文字bc
をBC
に置き換えます。
'abcdefgabcdefg'.Replace('bc','BC')
aBCdefgaBCdefg
正規表現を使う場合は-replace
を使います。
"abc`r`ndef" -replace "`r`n",","
abc,def
複数の条件を入れる場合も正規表現を使います。
'abc,def' -replace 'abc|def','xyz'
xyz,xyz
#n番目の文字の場所を調べる
(n番目の区切り文字の場所)+1を調べます。
$original='id,name,age,sex'
$c=0
$number=2
for($i=0;$i -lt $number;$i++){ $c=$original.IndexOf($target,$c)+1 }
8
後ろから数えるには、LastIndexOf
を使います。(後ろから数えてn番目の区切り文字の場所)-1を調べます。
$original='id,name,age,sex'
$c=0
$number=1
$c=$original.Length
for($i=0;$i -lt $number;$i++){ $c=$original.LastIndexOf($target,$c)-1 }
10
#文字を数える
(IndexOfを使う方法もあるのですが)ネットでは「元の文字数から対象の文字を消した文字数を引く」方法がよく書かれていました。
$original='id,name,age,sex'
$target=','
($original.Length-($original -replace $target,'').Length)/$target.Length
3
#特定の文字が入っている行を取り出す
ログファイル*.log
からerror
と書かれた行を取り出します。デフォルトでは大文字小文字を区別しないようです。
select-string *.log -Pattern 'error'
test1.log:3:system error 88
test2.log:6:service Error 99
#おわりに
PowerShellはWindowsに必ず入っているので、慣れてくるといろ色々なことができそうです。次回はcsvファイル関連のプログラムを作ってみたいと思います。