我想从下面和下面包含以下行的文件中获取子字符串 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
)
但它没有正常工作。请你帮忙
答案 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 子句,因此每次运行它时都会创建一个新文件。这不是剧本的重要部分,你可以将其评论出来。