私は Linux の男で、バッチ スクリプトを学ぼうとしています。
文字列を操作するには、次の要件があります。
set string=1.23.10xxxx2
上記の文字列からアルファベット文字を削除したかったのです。
1.23.102 または 1.23.10 としての出力が必要です。両方の出力で問題ありません。誰か助けてください。
私は Linux の男で、バッチ スクリプトを学ぼうとしています。
文字列を操作するには、次の要件があります。
set string=1.23.10xxxx2
上記の文字列からアルファベット文字を削除したかったのです。
1.23.102 または 1.23.10 としての出力が必要です。両方の出力で問題ありません。誰か助けてください。
フォーマットの長さが一貫している場合は、単純に部分文字列操作を使用できます。
1.23.10 を取得するには:
set "string=%string:~0,7%"
1.23.102 を取得するには:
set "string=%string:~0,7%%string:~-1%"
単純に文字x
を削除する場合は、検索と置換を使用します (常に大文字と小文字を区別しません)。
set "string=%string:x=%"
上記はすべて、help set
またはでアクセスできるヘルプに記載されていますset /?
。
しかし、上記のどれもあなたのニーズを満たすものではないと思います。文字の範囲を便利に検索および置換するためのバッチには何も組み込まれていません。FOR ループを使用して、各文字を繰り返し検索して置換することができます。通常の展開は解析時に発生し、FOR コンストラクト全体が 1 回のパスで解析されるため、これには遅延展開が必要です。
setlocal enableDelayedExpansion
for %%C in (
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
) do set "string=!string:%%C=!"
上記は機能しますが、比較的非効率的です。
問題を効率的に解決できるサードパーティのツールはいくらでもあります。ただし、非標準の実行可能ファイルは一部の環境では禁止されています。私は、この問題に対して非常にうまく機能するREPL.BATというハイブリッド バッチ/JScript ユーティリティを作成しました。XP以降の最新のWindowsマシンで動作します。リンクをクリックしてスクリプトを取得します。完全なドキュメントがスクリプトに組み込まれています。
REPL.BAT が現在のディレクトリにあるか、さらには PATH のどこかにあると仮定すると、次のように動作します。
for /f "eol=a delims=" %%S in ('repl "[a-zA-Z]" "" s string') do set "string=%%S"
GNUWin32 sedを使用できます:
@ECHO OFF &SETLOCAL
set "string=1.23.10xxxx2"
FOR /f %%a IN ('echo %string% ^| sed "s/[a-zA-Z]\+//"') DO set "newstring=%%a"
ECHO %newstring%