嗨,我正在尝试获得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 。
如果存在子句,也会有一个,因此每次运行它都会创建一个新文件。这不是脚本的重要组成部分,您可以将其评论。