https://oshiete.goo.ne.jp/qa/9818180.html
上記質問の続きです。
サクラエディタのGrep機能で一括で12桁の数字を抜き出すことはできたのですが、
上記質問の『例)kansei.txt』の形式で出力ができませんでした。
Grepツールで出力結果を細かく指定して出力できるものはありますか?
Grepの結果に毎回自分で置換を行えば目的のものは得られますが、同様の作業を何度も行う予定なので楽にできる方法があればと思っています。
自分でも調べましたが出力結果について明確に説明されているものは少なく、
Grepと同じようなコマンドプロンプトのfindstrや、PowershellのSelect-Stringも調べましたが
できるのかわからなかったので質問しました。
PCはWindows7です。
No.7ベストアンサー
- 回答日時:
N0.3のお礼を拝見しました。
12桁の途中で改行が入るということですよね?
では、以下でどうでしょう
-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名
Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
$s = Get-Content $_
if($s.gettype().Name -eq "Object[]"){$s = $s -join ""}
if($s -match "\d{12}"){
"$($Matches[0]) $($_.FullName)" | Out-File -FilePath $out -Append
}
}
}
----ここまで
No.6
- 回答日時:
No.2です。
バイナリファイル用に書き換えてみました。
search.ps1
-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名
function get_num12([string]$file){
$size = 12
[byte[]]$bs = [IO.File]::ReadAllBytes($file)
$begin = -1
$cnt = 0
for([int32]$i = 0;$i -lt $bs.Length; $i++){
if(($bs[$i] -ge 0x30) -and ($bs[$i] -le 0x39)){
if($begin -eq -1){
$begin = $i
$cnt++
} else {
$cnt++
if($cnt -eq $size){break}
}
} else {
$begin = -1
$cnt = 0
}
}
$num = ""
if($begin -ne -1){
for([int32]$i = $begin; $i -lt $begin + $size; $i++){
$num = $num + ($bs[$i] - 0x30)
}
}
return $num
}
Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
$num = get_num12($_.FullName)
if($num -ne ""){
"$($num) $($_.FullName)" | Out-File -FilePath $out -Append
}
}
}
-----ここまで
No.5
- 回答日時:
あなたの環境にruby1.9以上がインストールされているか、
rubyをインストールしてでも、この問題を解決したいということであれば、
この問題の解決の為のrubyのスクリプトを提供することは可能です。
いかがいたしましょうか。
No.4
- 回答日時:
こんにちは。
手動でも可能ですが、VBSにしてみました。
本家のGNU Grepは、まだ残っていますでしょうか?GNU Grep を使っています。
#2さんご指摘のように、これは、not text =binary だとすると、binary mode で検索しなければなりません。
cmd ="C:\Program Files\GnuWin32\bin\grep.exe -o -e --text "
(注意:コードの行の末尾には空白が入っているものがありますが、それは削除しないでください。)これは、全部がバイナリに限ります。汎用性が利きません。
また、以下のコードの対応テキストは、SJISとUTF-8で、Unicode は利用できません。
被検索のテキストファイルを、nkf.exe でとSJISに変更してから検索しないといけませんでした。条件さえ揃えば、便利だは思います。
GNU grep.exe 2.5.4 (古い)
正規表現の、"\d{12}" が使えませんでした。
検索する拡張子は、適宜変えてください。
''SeachNos_Grep.vbs
Dim cmd, myOption
Dim WshShell, objFS, objTextm,objRes
dim WshScriptExec
Set WshShell = CreateObject("WScript.Shell")
Set objFS = CreateObject("Scripting.FileSystemObject")
cmd ="C:\Program Files\GnuWin32\bin\grep.exe -o -e "
myOption = "[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9] "
''the extention is required to change.
Set WshScriptExec = WshShell.Exec(cmd & myOption &"*.zzz")
txOut=""
Set objRes = WshScriptExec.StdOut
Set objText =objFS.CreateTextFile("kansei.txt")
Do While objRes.AtEndOfStream = False
objText.Writeline ( objRes.Readline )
Loop
objText.Close
WScript.Sleep(100)
Msgbox "終了"
WScript.Quit
'-----------------------------
kansei.txt
ファイル名 と pattern にmatch した文字列 の順に出ます。
例:
048156660.txt:321545487489
ご質問者さんの環境では、成功率は半々というところかな。
ありがとうございます。
GNU Grepは入っていないです。
VBSの方が経験があるので今後行き詰ったときに参考にさせていただきます。
No.3
- 回答日時:
No2です。
> ファイルの場所が入っていない
"$($Matches[0]) $($name)"
↓
"$($Matches[0]) $($_.FullName)" の誤りでした。
> また、下記のエラーが20件出ます。
-match演算子で12桁の数字のマッチはしてるようですが、その数字がキャプチャできてないようですね。
検索対象がテキストファイルでないことが原因で上手くいかないのだと思いますが
実際のデータが手元にないので、よくわかりません。
土日はPCが使えないので遅くなりました。
ありがとうございます。
おかげさまでファイルの場所が正しく入りました。
実際のデータは改行があるので12桁が取得できないようです。
大体3~4行目に12桁の数字があります。
試しに改行を消してみるとうまくいきました。改行を無視して12桁を取得することはできるのでしょうか?
自分でもこれから調べてみますが今の時点ではわからないので、もし余裕がありましたら教えてください。
No.2
- 回答日時:
もっと良い方法があるかもしれませんが
PowerShellのスクリプトだとこんな感じでしょうか。
スクリプトファイルのある場所を検索対象にします。
search.ps1
-----ここから
$me = "search.ps1" # 本スクリプトファイル名
$out = "kansei.txt" # 出力ファイル名
Get-ChildItem | %{
$name = $_.Name
if(($name -ne $me) -and ($name -ne $out)){
if((Get-Content $_) -match "\d{12}"){
"$($Matches[0]) $($name)" | Out-File -FilePath $out -Append
}
}
}
-----ここまで
ありがとうございます。
教えていただいたスクリプトを試しに20ファイルある場所に置いて実行したところ、
作成されたkansei.txtに『(半角スペース)ファイル名』だけが20行(12桁とファイルの場所が入っていない)
また、下記のエラーが20件出ます。
『null 配列にインデックスを付けることはできません。
発生場所 C:\(ファイルの場所)\search.ps1:8 文字:10
+ $Matches[ <<<< 0]
+ CategoryInfo : InvalidOperation: (0:Int32) []、RuntimeException
+ FullyQualifiedErrorId : NullArray 』
原因わかりますでしょうか。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) bashのgrepで複数の検索、かつスクリプト内で改行する方法を教えてください。 1 2022/10/06 20:09
- フリーソフト サクラエディタの正規表現(grep機能)の使い方 3 2022/06/22 10:29
- UNIX・Linux bashでブランク(空白)を検索文字列として指定する方法 1 2022/04/13 22:29
- UNIX・Linux AWSのEC2のZabbixユーザーでawscliコマンドが実行できない状態を解決する 1 2022/12/06 22:17
- 教えて!goo 指摘されたので質問です 1 2022/04/17 14:11
- UNIX・Linux Linuxのbash環境下です。 1 2022/11/27 12:31
- その他(OS) Windowsで大量の画像サイズを半自動で変更する方法 6 2023/02/17 08:45
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- その他(悩み相談・人生相談) しまったな、職場で出来ることを見つけられない、成長できない、貢献できない 4 2022/11/29 20:27
- Excel(エクセル) Powershell エクセル検索 完全一致の方法 1 2022/06/05 20:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
System.out.printlnの意味がよ...
-
System.err. printlnとSystem.o...
-
Javaで改行などが出来ないのです。
-
1~100までの数字を表示し、か...
-
Eclipseのコンソールを常に表示...
-
System.out.printlnの出力先
-
javaのwhile文で九九の表
-
flush()とclose()について
-
Log4jで機能毎に別ファイルへ出...
-
文字の順番を昇順に
-
tomcatのstdout.logを停止したい。
-
Tomcatが無応答となる現象が起...
-
system.out.printが出力されない
-
Javaで任意のパスへ任意のファ...
-
大容量のテキストファイルの内...
-
【SQLServer接続のJSPの記述を...
-
Java 九九の表について
-
行列の表示
-
一定のスペースを空けて端を揃...
-
ArrayListによる計算表作成
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
System.err. printlnとSystem.o...
-
Log4jで機能毎に別ファイルへ出...
-
System.out.printlnの出力先
-
Eclipseのコンソールを常に表示...
-
Javaで改行などが出来ないのです。
-
flush()とclose()について
-
system.out.printが出力されない
-
1~100までの数字を表示し、か...
-
StringBufferで改ページ処理を...
-
InputStreamはreadが1回しかで...
-
JavaScriptの変数をjavaのメソ...
-
Tomcatが無応答となる現象が起...
-
1~100までの数字を表示したい
-
switch分が機能しません。
-
数字文字列をパック10進数に変...
-
VBSエラー"オブジェクト型の変...
-
Apache POI のログについて
-
System.out.printlnの意味がよ...
-
Javaの問題なのですが、 永久ル...
-
OpenSSL関数エラーについて
おすすめ情報