2013-07-08 58 views
0

我是一個Linux傢伙,並試圖學習批處理腳本。Windows腳本字符串操作來刪除字母字符

我有以下要求操縱字符串。

set string=1.23.10xxxx2 

我想從上面的字符串中刪除字母字符。

我需要的輸出爲1.23.102或1.23.10,這兩個輸出對我來說都很好,任何人都可以幫助我。

+0

一批具有相當有限/笨拙的字符串操作。來自linux,你會感到失望。你可以使用Python或其他東西嗎?或者安裝[unixutils](http://sourceforge.net/projects/unxutils/)並使用sed? – Blorgbeard

+0

查看'set /?',瞭解您可以通過批量處理的有限範圍的內容。 – Blorgbeard

回答

1

可以使用的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% 
+0

以及我需要一個Windows批處理腳本,我不能讓sed運行。 – user1642408

+0

我收到以下錯誤。'sed'不被識別爲內部或外部命令, 可操作的程序或批處理文件。 ECHO關閉。 – user1642408

+0

'sed'不是標準Windows安裝的一部分。你可以從我的答案中的鏈接下載它。你可以在批處理腳本中使用它,請用腳本查看我的答案。 – Endoro

2

如果格式具有一致的長度,那麼你可以簡單地使用子字符串操作。

要獲得10年1月23日:

set "string=%string:~0,7%" 

要獲得1.23.102:

set "string=%string:~0,7%%string:~-1%" 

如果你只是刪除字符x,然後使用搜索和替換(始終不區分大小寫):

set "string=%string:x=%" 

以上所有內容均在幫助中描述,可通過訪問或set /?

但我懷疑以上都不符合您的需求。批量中沒有內容可以方便地搜索和替換字符範圍。您可以使用FOR循環迭代搜索並替換每個字母。這需要延遲擴展,因爲正常擴展發生在解析時間,並且整個FOR構造被一次解析。

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" 
+0

您似乎已經忘記了鏈接到repl.bat? – Blorgbeard

+0

@Blorgbeard - Woops!鏈接添加,謝謝 – dbenham

3
@echo off 
set remove=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ 

set string=1.23.10xxxx2 
for /F "tokens=1,2 delims=%remove%" %%a in ("%string%") do (
    echo Part before removed chars: %%a 
    echo Part after removed chars: %%b 
    echo Both parts: %%a%%b 
) 
+0

是的,但對於大寫字母,你需要第二個循環。 – Endoro

+0

@Endoro:是的,或者在第一個字母中加上大寫字母......我只是用這種方法修復了這個問題! – Aacini