2014-11-25 19 views
0

我有一個文件,我正在使用for循環解析。我還提到了一個分隔符,因爲我想在遇到分隔符時分隔文本。它適用於所有線路接受一個。下面是當遇到提及的分隔符時,字符串不能分隔

#################################################################################################### 
# Directory structure 
#################################################################################################### 

DIRLIST   := $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 

我使用此代碼

setLocal EnableDelayedExpansion 
for /f "eol=# tokens=* delims=$(APPLICATION_PATH) " %%a in (test.txt) do (

set part1=%%a 

echo part1 = !part1! 
pause 
) 
+0

的執行使用延遲擴展,可使用'回聲part1的= !part1!' – Stephan 2014-11-25 08:56:50

+0

我曾嘗試使用並修改過我的代碼,但我仍然收到DIRLIST:= $(APPLICATION_PATH)/ test/app/model \ Setlocal EnableDelayedExpansion for /f "eol=# tokens=* delims=$(APPLICATION_PATH) " %%a in (..\..\..\Make\path_settings.mak) do ( \t \t set part1=%%a \t echo part1 = !part1! \t \t pause ) 2014-11-25 09:13:29

回答

2

for命令,delims子句用於指示將用作分隔符的字符列表。在你的情況下,對發佈的數據,分隔符應該是右括號,有兩個記號,​​第一個在左邊的文字或分隔符,第二個在分隔符的右側的文本

@echo off 
setLocal enableextensions disabledelayedexpansion 
for /f "tokens=1,* delims=)" %%a in (..\..\..\Make\path_settings.mak) do (
    if not "%%b"=="" echo(%%b 
) 

只有在行內可以存在第二個右括號時,才需要這兩個標記,因此token子句中的*將確保它將包含在檢索的數據中。但這意味着不包含括號的行將檢索到%%a的所有數據,並且%%b中沒有任何數據,因此if條件是必需的。

如果沒有第二個括號,則代碼可以被簡化爲

@echo off 
setLocal enableextensions disabledelayedexpansion 
for /f "tokens=2 delims=)" %%a in (..\..\..\Make\path_settings.mak) do (
    echo(%%a 
) 

編輯以反映命令

[M:\]:# type test.txt 
#################################################################################################### 
# Directory structure 
#################################################################################################### 

DIRLIST   := $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 
        $(APPLICATION_PATH)/test/app/model\ 

[M:\]:# type test.cmd 
@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f "tokens=2 delims=)" %%a in (test.txt) do (
     echo %%a 
    ) 


[M:\]:# test.cmd 
/test/app/model\ 
/test/app/model\ 
/test/app/model\ 
/test/app/model\ 
/test/app/model\ 
/test/app/model\ 
/test/app/model\ 
[M:\]:# 
+0

對於造成的困惑感到抱歉,括號內的內容爲評論 – 2014-11-25 09:17:11

+0

@SandeepBhat,我正在重讀這個問題和我的答案,還有一件事我看不清楚。究竟應該是最終的輸出? – 2014-11-25 09:21:27

+0

對不起,我需要的輸出是每行的/ test/app/model \/test/app/model \/test/app/model \/test/app/model \ – 2014-11-25 09:25:28

0

我覺得這其實不應該工作線。關鍵是分隔符不能是字符串,而是字符。如果你使用一個字符串,每個字符將被視爲一個分隔符。

然而,有一種變通方法:

  1. 更換要作爲一個特殊的cahr一個DELIM不會在你的字符串的字符串(如@,|等)
  2. 使用特殊字符

您可以在這裏找到一個例子拆分修改後的字符串:http://www.computerhope.com/forum/index.php?topic=134599.0回覆#3

+0

正確。除此之外,'tokens = *'覆蓋'delims = ...'並且你得到整行 – Stephan 2014-11-25 08:54:49

+0

@Stephan,覆蓋只是部分。如果行以'delims'子句中包含的字符開頭,則它們將不包含在檢索到的數據中。 – 2014-11-25 09:16:04