第3回シェル芸爆破デスマッチ勉強会&第21回餃子爆破定例会やってきた前回の挑戦はこちら
第2回チキチキ!シェル芸人養成勉強会をPowerShellでやってみた Hbstudy#38シェルスクリプトでいろいろやってみよう!をPowerShellでやってみた 「シェルスクリプト大喜利 第八回 ~”for,while禁止”に喜びを感じる人の何と多い事か!」をPowerShellでやってみた早速やってみました。
前提
前回同様の縛りプレイです。なるべく1ライナーで……敢えて、変数に収めるべきところすら、そのまま利用できるところはあ、繰り返しですが…一応。読みやすさを犠牲にパイプで繋ぐという制約で (おい
※シェル環境前提なので、なるべくAliasを利用しているのはご了承ください。 ※私はAlias余り好きじゃない派です。 ※PowerShellとBashの大きな違いは | (パイプ)で渡されるのが文字列ではなくオブジェクトということを念頭に…
Get-ChildItem #ls Get-Content #cat #gc Foreach-Object #% Where-Object #? Measure-Object #measure
問題1 • 携帯電話の番号にハイフンを入れてみましょう。
まずは、ファイルを作ります。@("09011112222","08098769876","09022221111") | Out-File .\1\tel.txtファイルが出来てますね。
09011112222 08098769876 09022221111
解法1. 普通に正規表現で
cat .\1\tel.txt | %{$_ -replace '(...)(....)(....)','$1-$2-$3'}
解法2. ごり押し文字抜出で
cat .\1\tel.txt | %{$_.Substring(0,3) + "-" + $_.Substring(3,4) + "-" + $_.Substring(7,4)}
解法3. 配列のjoinで
cat .\1\tel.txt | %{($_[0..2] -join "") + "-" + ($_[3..6] -join "") + "-" + ($_[7..10] -join "")}
結果表示です。いずれの解法も同じ結果です。
090-1111-2222 080-9876-9876 090-2222-1111
問題2 • 余計な文字を除去してハイフンを入れましょう。 (+81...は国内の番号表記に変換)
まずは、ファイルを作ります。@("0901-1112222","電 話 番 号 :08098769876","+81-90-2222-1111") | Out-File .\2\tel2.txtファイルが出来てますね。
0901-1112222 電 話 番 号 :08098769876 +81-90-2222-1111
解法1. ふとすると、-replace 演算子で正規表現処理して、こう書いてしまいますが
cat .\2\tel2.txt | %{$_ -replace "\+81","0" | %{$_ -replace "-",""} | %{$_ -match "\d*$" | Out-Null; $Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}}
解法2. -replaceに-replaceを重ねてもいいので
cat .\2\tel2.txt | %{$_ -replace "\+81","0" -replace "-",""} | %{$_ -match "\d*$" | Out-Null; $Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}
解法3. 当然-matchも重ねていいので
cat .\2\tel2.txt | %{$_ -replace "\+81","0" -replace "-","" -match "\d*$" | Out-Null; $Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}
解法4. Out-Nullは[void]してもいい、かつ-replace演算子ではなくreplaceメソッドでstring処理でもいいですね。
cat .\2\tel2.txt | %{[void]($_.replace("+81","0").replace("-","") -match "\d*$");$Matches.Values -replace '(...)(....)(....)','$1-$2-$3'}
結果表示です。いずれの解法も同じ結果です。
090-1111-2222 080-9876-9876 090-2222-1111
問題3 • 100行に水増ししてください。
まずは、ファイルを作ります。"あ あ あ あ あ あ あ あ あ あ あ あ !" | Out-File .\3\hoge.txtファイルが出来てますね。
あ あ あ あ あ あ あ あ あ あ あ あ !
解法. 単純に増殖です。
1..100 | %{cat .\3\hoge.txt}
結果表示です。
あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ ! あ あ あ あ あ あ あ あ あ あ あ あ !
問題4 • カンマ、句点を全て全角の句点に 変換してください。
出題者様へ疑問です………あの、句点って"。"なんですが……、読点"、"とカンマ","を全角の句点"。"に置き換えるものとします。(逆も同じ要領なのでいいですよね)まずは、ファイルを作ります。
"働けど、働けど,我が暮らし、楽にならず,JITコンパイラ。" | Out-File .\4\sakubun.txtファイルが出来てますね。
働けど、働けど,我が暮らし、楽にならず,JITコンパイラ。
解法1. 単純に-replace演算子で
cat .\4\sakubun.txt | %{$_ -replace ",","。" -replace ",","。" -replace "、","。"}
解法2. .replaceメソッドも同様です。
cat .\4\sakubun.txt | %{$_.replace(",","。").replace(",","。").replace("、","。")}
解法3. ハッシュテーブルで変換表を作っておくと、パターンが増えても平気ですね。
begin{$string=@{","="。";","="。";"、"="。"}}process{cat .\4\sakubun.txt | % {$result = $_;$string.GetEnumerator() | %{if (!$result -match $_.Keys){$result = $line -replace $_.Key,$_.Value}}}}end{$result}
解法3が分かりにくいから改行しろ?はい。
begin{ $string=@{ ","="。" ","="。" "、"="。"} } process{ cat .\4\sakubun.txt | % { $result = $_;$string.GetEnumerator() | %{ if (!$result -match $_.Keys) { $result = $line -replace $_.Key,$_.Value } } } } end{ $result }
begin{}process{}end{}を使わないとこうです。
$string=@{ ","="。" ","="。" "、"="。" } cat .\4\sakubun.txt | % { $result = $_ $string.GetEnumerator() | %{ if (!$result -match $_.Keys) { $result = $line -replace $_.Key,$_.Value } } $result }
結果表示です。いずれの解法も同じ結果です。
働けど。働けど。我が暮らし。楽にならず。JITコンパイラ。
問題5 • 次の変換を行ってください。 – ¥_ を _ – _ を半角空白
まずは、ファイルを作ります。"\ ダッダーン\_! _ボヨヨン\_ボヨヨン_" | Out-File .\5\dadan.txtファイルが出来てますね。
\ ダッダーン\_! _ボヨヨン\_ボヨヨン_
解法1. -replace 演算子で正規表現処理
cat .\5\dadan.txt | %{$_ -replace "\\_","_" -replace "_"," "}
解法2. .replace メソッドでstring処理
cat .\5\dadan.txt | %{$_.replace("\_","_").replace("_"," ")}
結果表示です。いずれの解法も同じ結果です。
\ ダッダーン ! ボヨヨン ボヨヨン
問題6 • 文字数を数えてください。
まずは、ファイルを作ります。"あいうえお`nかきくけこ" | Out-File .\6\aiueo.txtファイルが出来てますね。
あいうえお かきくけこ
解法1. lengthをmeasureで
cat .\6\aiueo.txt | %{$_.length} | measure -sum
結果表示です。
Count : 2 Average : Sum : 10 Maximum : Minimum : Property :
解法2. .getenumerator()をmeasureで
cat .\6\aiueo.txt | %{$_.getenumerator()} | measure
解法3. [System.Linq.Enumerable]::ToArray()をmeasureで
cat .\6\aiueo.txt | %{[System.Linq.Enumerable]::ToArray($_)} | measure
結果表示です。解法2と3は同じ結果です。
Count : 10 Average : Sum : Maximum : Minimum : Property :
問題7 • シバンを全て「#!/usr/local/bin/bash」 に変更してください
PowerShellなので、#required -Version 2.0を#required -Version 3.0に変更することにします。 まずは、ファイルを作ります。@("a.ps1","b.ps1","c.ps1") | %{$file=$_;"#required -Version 2.0`necho hoge" | Out-File .\7\$file}ファイルが出来てますね。
PS D:\document\program\powerShell\usp3> ls 7 ディレクトリ: D:\document\program\powerShell\usp3\7 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2013/02/18 15:24 70 a.ps1 -a--- 2013/02/18 15:24 70 b.ps1 -a--- 2013/02/18 15:24 70 c.ps1内容も問題ないようです。
#required -Version 2.0 echo hoge
解法1.バックアップを作らず差し替え。(ないわぁ)
普通にファイル操作で行うと…。ls .\7\*.ps1 | %{$file=$_.Name; cat .\7\$file | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/new_$file -Append;del .\7\$file; Ren ./7/new_$file $file }あるいは、${ファイルパス}により、インプレース入れ替えもできます。が…フルパス指定を求められ、相対パスは利用できません。
@("a","b","c") | %{$ex1 ="{d:\7\$_.ps1}";$ex2 = "{d:\7\$_.ps1} -replace `"#required -Version 2.0`",`"#required -Version 3.0`"";Iex $"$ex1"=$"$ex2"}絶対パスなど書いていられない場合はこれですね。
ls .\7\*.ps1 | %{$ex1 ="{$_}";$ex2 = "{$_} -replace `"#required -Version 2.0`",`"#required -Version 3.0`"";Iex $"$ex1"=$"$ex2"}
結果表示です。
PS D:\document\program\powerShell\usp3> ls .\7\ ディレクトリ: D:\document\program\powerShell\usp3\7 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2013/02/18 15:30 72 a.ps1 -a--- 2013/02/18 15:30 72 b.ps1 -a--- 2013/02/18 15:30 72 c.ps1差し替わっています。
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1 #required -Version 3.0 echo hoge
解法2. オリジナルをそのままに、新しいファイルを、 new_として生成。
ls .\7\*.ps1 | %{$file=$_.Name; cat .\7\$file | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/new_$file -Append;del .\7\$file; Ren ./7/new_$file $file }
結果表示です。
PS D:\document\program\powerShell\usp3> ls .\7\ ディレクトリ: D:\document\program\powerShell\usp3\7 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2013/02/18 15:32 70 a.ps1 -a--- 2013/02/18 15:32 70 b.ps1 -a--- 2013/02/18 15:32 70 c.ps1 -a--- 2013/02/18 15:32 72 new_a.ps1 -a--- 2013/02/18 15:32 72 new_b.ps1 -a--- 2013/02/18 15:32 72 new_c.ps1
オリジナルはそのままで
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1 #required -Version 2.0 echo hoge
結果、新しいファイルができています。
PS D:\document\program\powerShell\usp3> cat .\7\new_a.ps1 #required -Version 3.0 echo hoge
解法3. オリジナルをbak_として残して、既存ファイル内容を差し替え。
ls .\7\*.ps1 | %{$file=$_.Name;copy .\7\$file .\7\bak_$file; del .\7\$file; cat .\7\bak_$file | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/$file -Append }
結果表示です。
PS D:\document\program\powerShell\usp3> ls .\7\ ディレクトリ: D:\document\program\powerShell\usp3\7 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2013/02/18 15:34 72 a.ps1 -a--- 2013/02/18 15:34 72 b.ps1 -a--- 2013/02/18 15:34 70 bak_a.ps1 -a--- 2013/02/18 15:34 70 bak_b.ps1 -a--- 2013/02/18 15:34 70 bak_c.ps1 -a--- 2013/02/18 15:34 72 c.ps1オリジナルが差し替わり
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1 #required -Version 3.0 echo hogeバックアップができています。
PS D:\document\program\powerShell\usp3> cat .\7\bak_a.ps1 #required -Version 2.0 echo hoge
解法3-2. オリジナルを$file_bak.ps1として残して、既存ファイル内容を差し替え。
拡張子の前に_bakと入れる場合は小細工をします。ls .\7\*.ps1 | %{$file=$_.Name;$bakfile=($_.BaseName + "_bak" + $_.Extension); copy .\7\$file .\7\$bakfile; del .\7\$file; cat .\7\$bakfile | %{$_ -replace "#required -Version 2.0","#required -Version 3.0"} | Out-File ./7/$file -Append }
結果表示です。
PS D:\document\program\powerShell\usp3> ls .\7\ ディレクトリ: D:\document\program\powerShell\usp3\7 Mode LastWriteTime Length Name ---- ------------- ------ ---- -a--- 2013/02/18 15:38 72 a.ps1 -a--- 2013/02/18 15:38 70 a_bak.ps1 -a--- 2013/02/18 15:38 72 b.ps1 -a--- 2013/02/18 15:38 70 b_bak.ps1 -a--- 2013/02/18 15:38 72 c.ps1 -a--- 2013/02/18 15:38 70 c_bak.ps1オリジナルが差し替わり
PS D:\document\program\powerShell\usp3> cat .\7\a.ps1 #required -Version 3.0 echo hogeバックアップができています。
PS D:\document\program\powerShell\usp3> cat .\7\a_bak.ps1 #required -Version 2.0 echo hoge
問題8 • table中のデータをスペース区切りで 抜き出してください。
まずは、ファイルを作ります。 どうせ作るなら、タグ打ちではなく、ConvertTo-HTMLを利用しましょう。$a=[PScustomObject]@{data="a";data2="b";data3="c"}; $b=[PScustomObject]@{num=1;num2=2;num3=3}; $html = $a | ConvertTo-Html -Fragment -As Table | %{ $_ -replace "<colgroup>.*</colgroup>","" -replace "<tr><th>.*</th></tr>","" -replace "</table>",""} | Select-String -Pattern "\S" | %{$_.line} $html += $b| ConvertTo-Html -Fragment -As Table | %{ $_ -replace "<colgroup>.*</colgroup>","" -replace "<tr><th>.*</th></tr>","" -replace "<table>",""} | Select-String -Pattern "\S" | %{$_.line} $html | Out-File .\8\hoge.htmlファイルが出来てますね。
<table> <tr><td>a</td><td>b</td><td>c</td></tr> <tr><td>1</td><td>2</td><td>3</td></tr> </table>
解法1. whereから正規表現マッチ結果を受けて残ったタグのみreplace処理。
cat .\8\hoge.html | ?{$_ -match "<tr>(?<data>.*)</tr>"} | %{$Matches.data.replace("<td>","").replace("</td>"," ") }
解法2. tr
でsplitしてから、whereで正規表現マッチ、結果を受けて残ったタグのみreplace処理。
cat .\8\hoge.html | %{$_ -split "<tr>" | ?{$_ -match "(?<data>.*)</tr>"}| %{$Matches.data.Replace("<td>","").replace("</td>"," ")}}
解法3. 読み込み時にSelect-Stringで正規表現マッチ、結果を受けて残ったタグをreplace処理。
Select-String -Path .\8\hoge.html -Pattern "<tr>.*</tr>" | %{$_.line.replace("<tr>","").replace("</tr>","").replace("<td>","").replace("</td>"," ")}
解法4. 解法3の読み込み時のSelect-Stringにおける正規表現マッチは実はこれでもいいわけで。
Select-String -Path .\8\hoge.html -Pattern "<tr>.*" | %{$_.line.replace("<tr>","").replace("</tr>","").replace("<td>","").replace("</td>"," ")}
解法5. ちなみに問題の解法例にあったような改行を無くしてからの処理はこんなに面倒になります。
New-Object IO.StreamReader((Convert-Path .\8\hoge.html),[text.Encoding]::Default) | %{$_.ReadToEndAsync().Result } | %{$_.replace("`r`n","").replace("<table>","").replace("</table>","").replace("<tr>","").replace("</tr>","`r`n").replace("<td>","").replace("</td>"," ")}
結果表示です。いずれの解法も同じ結果です。
※わざわざa b cと1 2 3を別の行に出るように調整してますのであしからず。(正直同一行の方が簡単だったのですが…問題が別の行指定のようだったので)a b c 1 2 3
問題9 • aliasを解除してください。
まずは、Aliasを作ります。Set-Alias l ls Set-Alias l1 ls Set-Alias l2 ls Set-Alias l3 lsAliasが出来てますね。
PS D:\document\program\powerShell\usp3> @("",1,2,3) | %{ Get-Alias "l$_"} CommandType Name ModuleName ----------- ---- ---------- Alias l -> Get-ChildItem Alias l1 -> Get-ChildItem Alias l2 -> Get-ChildItem Alias l3 -> Get-ChildItemユーザー定義のalias全てを指定するには、次の条件で出来そうです。(単純に作ったものだけなら上記のでいいのですが)
Get-Alias | ?{$_.Options -eq "None" -and $_.HelpUri -eq ""}
解法. 指定したAliasをaliasのpsdriveから削除
Get-Alias | ?{$_.Options -eq "None" -and $_.HelpUri -eq ""} | %{Remove-Item alias:$_}
結果表示です。きっちり消えています。
PS D:\Document\Program\Powershell\usp3> @("",1,2,3) | %{ Get-Alias "l$_"} Get-Alias : name 'l' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。 発生場所 行:1 文字:18 + @("",1,2,3) | %{ Get-Alias "l$_"} + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (l:String) [Get-Alias], ItemNotFoundException + FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand Get-Alias : name 'l1' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。 発生場所 行:1 文字:18 + @("",1,2,3) | %{ Get-Alias "l$_"} + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (l1:String) [Get-Alias], ItemNotFoundException + FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand Get-Alias : name 'l2' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。 発生場所 行:1 文字:18 + @("",1,2,3) | %{ Get-Alias "l$_"} + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (l2:String) [Get-Alias], ItemNotFoundException + FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand Get-Alias : name 'l3' を含むエイリアスは存在しないため、このコマンドは一致するエイリアスを見つけられません。 発生場所 行:1 文字:18 + @("",1,2,3) | %{ Get-Alias "l$_"} + ~~~~~~~~~~~~~~~ + CategoryInfo : ObjectNotFound: (l3:String) [Get-Alias], ItemNotFoundException + FullyQualifiedErrorId : ItemNotFoundException,Microsoft.PowerShell.Commands.GetAliasCommand
問題10 • 以下の部分だけ抽出してください。 – %%1%% と %%2%% の間 – %%3%% と %%4%% の間
まずはファイルを作ります。"%%1%%`n`t私はだれ?`n%%2%%`n`tナタデココ`n%%3%%`n`tここはどこ?`n%%4%%`n`tなかったでココに。`n%%5%%" | Out-File .\10\coco.txtヒアストリングを使ってもいいですね。
@" %%1%% `t私はだれ? %%2%% `tナタデココ %%3%% `tここはどこ? %%4%% `tなかったでココに。 %%5%% "@ | Out-File .\10\coco.txtファイルが出来てますね。
PS D:\Document\Program\Powershell\usp3> cat .\10\coco.txt %%1%% 私はだれ? %%2%% ナタデココ %%3%% ここはどこ? %%4%% なかったでココに。 %%5%%
解法1. 文字行だけにしてから、行を指定
cat .\10\coco.txt | ?{$_ -notmatch "%%.*"} | Select-String -Pattern "\S" | ?{$_.LineNumber -eq 1 -or $_.LineNumber -eq 3}
解法2. 初めから行を指定
Select-String -Path .\10\coco.txt -Pattern "\S" | ?{$_.LineNumber -eq 2 -or $_.LineNumber -eq 6} | select -ExpandProperty line
解法3. いや、?含んだ行じゃ (おい
cat .\10\coco.txt | ?{$_ -match ".*?" }
結果表示です。きっちり消えています。
私はだれ? ここはどこ?※本来は行間を指定するべきですが飽きたので……すいません。
延長戦 • 精度よく足してください (答え:3150101.7933532523523)
まずはファイルを作ります。@([string]0.1243532523523,[string]-1251.331,[string]3151353) | Out-File .\延長戦\num.txtファイルが出来てますね。
PS D:\Document\Program\Powershell\usp3> cat .\延長戦\num.txt 0.1243532523523 -1251.331 3151353あれ?……あ、ギブアップで…?えっと、桁落ちが防げない……。 [double]も[decimal]もToString(G17)もダメらしく…
#doubleにキャスト cat .\延長戦\num.txt | %{[double]$_} | measure -sum #decimalにキャスト cat .\延長戦\num.txt | %{[decimal]$_} | measure -sum #ToString(G17) $a = cat .\延長戦\num.txt | %{[decimal]$_} | measure -sum $a.sum.ToString("G17")結果表示です。桁落ちしていますね…。
3150101.79335325 #double 3150101.79335325 #decimal 3150101.7933532526 #ToString(G17)
@guitarrapc [decimal]0.1243532523523-1251.331+3151353 でいけるように思いますが、そういうことではなく? ちなみにMeasure-ObjectのSumプロパティはdoubleですね。
— 牟田口大介さん (@mutaguchi) 2013年2月18日
ってことでこれ。
cat .\延長戦\num.txt | %{$result=0}{[decimal]$result+=$_}{$result}あるいは数値リテラルでこれとか。
0.1243532523523d-1251.331+3151353それかこれ。
[decimal]0.1243532523523-1251.331+3151353結果表示です。大丈夫ですね。measure -sumは注意でした。
PS D:\Document\Program\Powershell\usp3> cat .\延長戦\num.txt | %{$result=0}{[decimal]$result += $_ }{$result} 3150101.7933532523523PowerShellは、明示しないと暗黙でdoubleに型変換されるので注意です。
0.1243532523523-1251.331+3151353 #これはdoubleになり桁落ちする