将子字符串从结束脱机提取到批处理文件中的特殊字符

时间:2017-06-05 09:21:15

标签: 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/ZoomIn40X

Job Name : STANALONE/1234/Date/ZoomIn10X

我试过了

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

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

)

但它没有正常工作。请你帮忙

4 个答案:

答案 0 :(得分:1)

在unix上,使用perl

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

有关选项,请参阅perl -h,有关详细信息,请参阅perlop regex。 习惯性替换表达式使用/正斜杠分隔符编写,但任何其他字符都可以在sed中使用。这里使用@来避免转义/

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

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

查看bash变量扩展。这里##删除最长的前缀。

答案 1 :(得分:1)

>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]:#

答案 2 :(得分:0)

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

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

ZoomIn20X

ZoomIn30X

ZoomIn40X

ZoomIn10X

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

答案 3 :(得分:0)

我认为其他答案并不是使用仅批处理语法。

如果您已经编写了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

这是一种效率低下的解决方案,您可以在下面找到更好的解决方案,但也收集变量。它使用的事实是你可以多次分割字符串,如果你有不同的字符串长度,你仍然可以根据字符串提取它,如果它是相同的,就像在你的情况下是“日期”。 First FOR基于“:”字符拆分字符串,基于“/”char拆分其他FORs。有两个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 “令牌= 2”(需要第二部分),“delims =:”使用“:”作为分隔符。

解决方案的核心使用了你想要提取的最终常量字符串(确切地说是9个字符)的事实 - !var:〜-9! 即可。使用扩展变量,从使用FOR语句选择的字符串末尾获取9个字符。

解决方案需要在 SETLOCAL ENABLEDELAYEDEXPANSION 中使用扩展。

还有一个 IF EXISTS 子句,因此每次运行它时都会创建一个新文件。这不是剧本的重要部分,你可以将其评论出来。