クラシック Windows CMD の出力で数字 (0 ~ 9) のみをフィルターする

クラシック Windows CMD の出力で数字 (0 ~ 9) のみをフィルターする

たとえば次のようなテキストがあります:

cd123aaq54

そして、数字だけを別のファイルに分けたいので、

12354

出力に。

私は次のようなコマンドをたくさん試してきました:

Get-Content text.txt | Select-String  -Pattern '[0-9]'

Linux では、次のようにするとずっと簡単になります。

grep -o '[0-9][0-9]*' text >numbers

Windowscmdシェルでこれを実行するにはどうすればよいですか?

答え1

入力ファイルからアルファベット文字を削除して数字だけを残すにはどうすればよいですか?

以下に 2 つの解決策を示します。

  • パワーシェル
  • Windows バッチファイル

PowerShell ソリューション

次のコマンドを使用します。

Get-Content input.txt | ForEach-Object {$_ -Replace "[^0-9]", ""} > output.txt

ノート:

  • input.txtフィルタリングするテキストが含まれます。

  • output.txtフィルタリングされたテキストを含む

  • 数字以外の文字(英字だけでなく)はすべて削除されます。

例:

PS F:\test> type .\input.txt
cd123aaq54
zyx456abc321
PS F:\test> Get-Content input.txt | ForEach-Object {$_ -Replace "[^0-9]", ""} > output.txt
PS F:\test> type .\output.txt
12354
456321
PS F:\test>

Windows バッチファイルソリューション

次のバッチ ファイル (RemoveAlpha.cmd) を使用します。

@echo off
setlocal enabledelayedexpansion
set _alpha=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
rem read input file line by line
for /f "usebackq tokens=*" %%i in (`type %1`) do (
  rem strip alpha characters by using them as delimeters
  for /f "tokens=1,2 delims=%_alpha%" %%j in ("%%i") do (
    rem write stripped text to output file
    echo %%j%%k>>%2
    )  
  )
endlocal

ノート:

  • 上記は、!@#$%^&*()入力ファイルに特殊文字 ( ...) が含まれていないことを前提としています (特殊文字は削除されません)。

  • 'トリック' は、2 番目のforコマンドの区切り文字としてアルファ文字の文字列を使用することです。

使用法:

RemoveAlpha input output
  • input: フィルタリングするテキストを含む入力ファイルのパス名。

  • output: コピーされたフィルター テキストを格納する出力ファイルのパス名。

例:

F:\test>RemoveAlpha input.txt output.txt

F:\test>type input.txt
cd123aaq54
zyx456abc321

F:\test>type output.txt
12354
456321

参考文献

関連情報