从离线末端提取子字符串到批处理文件中的特殊字符



嗨,我正在尝试获得sub String 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/ZoomIn40X
Job Name : STANALONE/1234/Date/ZoomIn10X

我尝试了

for /F "tokens=*" %%A in (input.txt) do (
   echo %%A r "/" "n" %%A | tail -1 >> output.txt
)

但是它不能正常工作。请您帮助

in unix,带有perl

perl -pe 's@.*/@@' input.txt

有关选项,请参见perl -h,并且perlop regex有关更多详细信息。习惯性地替代表达式是用/前向斜线定界符编写的,但任何其他字符都可以按照SED中的方式使用。在这里使用@避免/

或使用Shell Language Bash(由于bash读而慢(

while read -r line; do
    echo "${line##*/}"
done <input.txt

请参阅bash变量扩展。在这里##删除最长的前缀。

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

给定输入行,并使用for可更换参数修饰符(请参阅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]:#

使用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

这是有点效率的解决方案,您可以在下面找到更好的解决方案,但也收集变量。它使用了一个事实,即您可以多次拆分字符串,如果您的字符串长度不同,则仍然可以根据字符串提取它,如果是相同的话,例如在您的情况下是"日期"。首先是基于":"字符和基于"/" char的其他fors的字符串。有两个孔,因为您的提取的字符串的长度不同。



编辑:

我认为我太快了,无法找到解决方案。当我想到它时,我将其视为非常"粗糙"的解决方案。我也只发布了代码,我也会更好地评论它。

更有效的解决方案:

@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个字符(的事实 - !var:〜-9!。使用扩展的变量,并从字符串的末尾采用9个字符,并在使用语句中选择。

解决方案需要在使用扩展时具有 setLocal enabledElayedExpansion

如果存在子句,也会有一个,因此每次运行它都会创建一个新文件。这不是脚本的重要组成部分,您可以将其评论。

最新更新