Batch file 将子字符串从end offline提取到批处理文件中的特殊字符

Batch file 将子字符串从end offline提取到批处理文件中的特殊字符,batch-file,unix,Batch File,Unix,您好,我正在尝试从包含以下行的文件中获取子字符串ZoomIn10X、ZoomIn20X、ZoomIn30X等,并将其输出到另一个文件 Job Name : STANALONE/1234/JobId/Date/ZoomIn10X Job Name : STANALONE/1234/JobId/Date/ZoomIn20X Job Name : STANALONE/JobId/Date/ZoomIn30X Job Name : STANALONE/1234/JobId/Date/ZoomIn4

您好,我正在尝试从包含以下行的文件中获取子字符串ZoomIn10XZoomIn20XZoomIn30X等,并将其输出到另一个文件

Job Name : STANALONE/1234/JobId/Date/ZoomIn10X

Job Name : STANALONE/1234/JobId/Date/ZoomIn20X

Job Name : STANALONE/JobId/Date/ZoomIn30X

Job Name : STANALONE/1234/JobId/Date/ZoomIn40X

Job Name : STANALONE/1234/Date/ZoomIn10X
我试过了

for /F "tokens=*" %%A in (input.txt) do (

   echo %%A r "/" "\n" %%A | tail -1 >> output.txt

)
但是它不能正常工作。你能用perl在unix上帮助我吗

perl -pe 's@.*/@@' input.txt
有关选项,请参见
perl-h
,有关详细信息,请参见
perlop regex
。 惯常使用的替换表达式是用
/
正斜杠分隔符编写的,但任何其他字符都可以像在sed中一样使用。这里使用
@
避免转义
/

或者使用shell语言bash(由于bash读取速度较慢)

读取-r行时
;做
回显“${line##*/}”

完成使用awk,您可以将
/
定义为字段分隔符,并输出最后一个字段:

$ awk -F/ '{print $NF}' input.txt
ZoomIn10X

ZoomIn20X

ZoomIn30X

ZoomIn40X

ZoomIn10X

解决方案输出每行的最后一个字段,包括数据行之间的空行。如果您需要以某种方式过滤输出,请更新OP的要求。

我认为其他答案没有使用仅批处理语法

如果您有您所写的input.txt文件,那么以下解决方案应该可以工作(我添加了偶数选项以将解决方案用作变量):

编辑:
为脚本添加了注释:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM your input.txt file looks like this
REM Job Name : STANALONE/1234/JobId/Date/ZoomIn10X
REM Job Name : STANALONE/1234/JobId/Date/ZoomIn20X
REM Job Name : STANALONE/JobId/Date/ZoomIn30X
REM Job Name : STANALONE/1234/JobId/Date/ZoomIn40X
REM Job Name : STANALONE/1234/Date/ZoomIn10X

REM if you wished to use variable
REM SET final_name=""

FOR /F "tokens=2 delims=:" %%A IN (input.txt) DO (
    SET temp_var=%%A
    FOR /F "tokens=4 delims=/" %%B IN ("!temp_var!") DO (
        SET temp_var_B=%%B
        IF "!temp_var_B!" EQU "Date" (
            FOR /F "tokens=5 delims=^/" %%C IN ("!temp_var!") DO (
                ECHO %%C >> output.txt
                REM if you wished to use variable
                REM SET final_name=!final_name!,%%C
            )
        ) ELSE (
           ECHO %%B >> output.txt
           REM if you wished to use variable
           REM SET final_name=!final_name!,%%B
        )
    )
)
ECHO All collected variables: !final_name!
ENDLOCAL
这是一个效率较低的解决方案,您可以在下面找到更好的解决方案,但也会收集变量。它使用了这样一个事实,即可以多次拆分字符串,如果字符串长度不同,则仍然可以根据相同的字符串(如“日期”)提取该字符串。第一个FOR基于“:”字符拆分字符串,另一个FOR基于“/”字符拆分字符串。有两个FOR,因为提取的字符串长度不同



编辑:

我想我太快找不到解决办法了。当我想到这一点时,我意识到这是一个非常“粗糙”的解决方案。我还将对它进行更好的注释,因为我只发布了代码

更有效的解决方案:

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
REM your input.txt file looks like this
REM Job Name : STANALONE/1234/JobId/Date/ZoomIn10X
REM Job Name : STANALONE/1234/JobId/Date/ZoomIn20X
REM Job Name : STANALONE/JobId/Date/ZoomIn30X
REM Job Name : STANALONE/1234/JobId/Date/ZoomIn40X
REM Job Name : STANALONE/1234/Date/ZoomIn10X

FOR /F "tokens=2 delims=:" %%A IN (input.txt) DO (
   SET var=%%A
   IF EXIST input.txt (
       ECHO !var:~-9! >> output.txt
   ) ELSE (
       ECHO !var:~-9! > output.txt
   )
)
ENDLOCAL
说明:
首先是FOR/F的,带有“tokens=2”(包含第二部分)和“delims=:”使用“:”作为分隔符

解决方案的核心使用了这样一个事实,即您要提取的字符串末尾具有恒定大小的字符串(准确地说是9个字符)-!变量:~-9。使用展开变量并从使用FOR语句选择的字符串末尾提取9个字符

解决方案在使用扩展时需要在那里启用SETLOCAL ENABLEDELAYEDEXPANSION

还有一个IF EXISTS子句,因此每次运行它时它都会创建一个新文件。这不是脚本的重要部分,您可以将其注释掉。

>output.txt(对于/f“delims=“%a in(input.txt)do echo%%~nxa)
给定输入行,并将其作为路径+文件引用进行处理(是的,它们不是,但可以像处理文件一样进行处理),使用
for
可替换参数修饰符(请参见
for/?
),我们请求被引用文件的名称和扩展名。执行的
的所有输出被重定向到
output.txt

[W:\44365640]:# type go.cmd
@echo off
    setlocal enableextensions disabledelayedexpansion

    >output.txt (for /f "delims=" %%a in (input.txt) do echo %%~nxa)


[W:\44365640]:# type input.txt
Job Name : STANALONE/1234/JobId/Date/ZoomIn10X

Job Name : STANALONE/1234/JobId/Date/ZoomIn20X

Job Name : STANALONE/JobId/Date/ZoomIn30X

Job Name : STANALONE/1234/JobId/Date/ZoomIn40X

Job Name : STANALONE/1234/Date/ZoomIn10X

[W:\44365640]:# go
[W:\44365640]:# type output.txt
ZoomIn10X
ZoomIn20X
ZoomIn30X
ZoomIn40X
ZoomIn10X

[W:\44365640]:#

第一个问题-您是在windows cmd还是unix上运行?
[W:\44365640]:# type go.cmd
@echo off
    setlocal enableextensions disabledelayedexpansion

    >output.txt (for /f "delims=" %%a in (input.txt) do echo %%~nxa)


[W:\44365640]:# type input.txt
Job Name : STANALONE/1234/JobId/Date/ZoomIn10X

Job Name : STANALONE/1234/JobId/Date/ZoomIn20X

Job Name : STANALONE/JobId/Date/ZoomIn30X

Job Name : STANALONE/1234/JobId/Date/ZoomIn40X

Job Name : STANALONE/1234/Date/ZoomIn10X

[W:\44365640]:# go
[W:\44365640]:# type output.txt
ZoomIn10X
ZoomIn20X
ZoomIn30X
ZoomIn40X
ZoomIn10X

[W:\44365640]:#