关于批处理文件:替换整行cmd

Replace entire line cmd

我有一个文件,我在其中搜索特定的文本,并希望将其替换为另一个。例如:

1
<role-name>test</role-name>

例如,这是我要替换为的内容:

1
<role-name>file</role-name>

这里的问题是<role-name>标记中可能是" test "以外的其他文本。

如何找到整行并将其替换为所需的文本?

或者也许我可以检索标签的行号并将其整体替换,但是同样我也不知道该怎么做:-)


问题是我正在从文件中读取内容,而我想比较的字符串出现在for循环中。这是我的代码,可以从文件中读取并编写所需的代码(如果有人需要的话):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
set"nameofapp=%<display-name>"
set"nameofapp_country=%    <display-name>ASD</display-name>"
set"rolename=%<role-name>"
set"rolename_country=%                <role-name>ASD-role</role-name>"
set"propertiesfile=%<env-entry-value>"
set"properties_file=%        <env-entry-value>java-asd.properties</env-entry-value>"
set"web=src\\main\\webapp\\WEB-INF\\web.xml"
set"web_1=web.xml"

(for /f"delims=" %%i in (%web%) do (
    set"line=%%i"
    setlocal enabledelayedexpansion

    set"name=!line:%nameofapp%=%!"
    if not !name! == !line! (
        set"line=%nameofapp_country%"
    )

    set"role=!line:%rolename%=%!"
    if not !role! == !line! (
        set"line=%rolename_country%"
    )

    set"property=!line:%propertiesfile%=%!"
    if not !property! == !line! (
        set"line=%properties_file%"
    )
    echo(!line!
    endlocal
))>"%web_1%"
del %web%
Move %web_1% "src\\main\\webapp\\WEB-INF"

无需外部代码即可执行此操作的关键是使用字符串替换表达式。我假设您想参数化标签和值字符串。这也取决于没有任何换行符的序列。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
C:>type seb.bat
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET EXITCODE=0

SET"TAG=%~1"
SET"FROMVAL=%~2"
SET"TOVAL=%~3"

FOR /F"usebackq tokens=*" %%a IN (`TYPE"seb.html"`) DO (

    echo %%a

    SET S1=%%a
    SET S2=!S1:^<%TAG%^>%FROMVAL%^</%TAG%^>=^<%TAG%^>%TOVAL%^</%TAG%^>!
    ECHO !S2!
)

EXIT /B %EXITCODE%

C:>type seb.html
<role-name>test</role-name>

C:>seb role-name test file
<role-name>test</role-name>
<role-name>file</role-name>
<role-name></role-name>
<role-name></role-name>

C:>seb role-name test""
<role-name>test</role-name>
<role-name></role-name>
<role-name></role-name>
<role-name></role-name>

C:>seb role-name"""file"
<role-name>test</role-name>
<role-name>test</role-name>
<role-name></role-name>
<role-name>file</role-name>