我想做这个:
使用 PowerShell 在所有行中包含/排除第 n 个字符和第 n 个不同字符之间的文本
但没有 PowerShell,即使用命令提示符中的批处理文件(.bat、.cmd)。
我有一个文本文件,其中有很多这样的行:
BALL - A 5122-ABCD-STH-PC2016/A 5122 : It's a duplicate.
CIRCLE - B 612-DEFGH-STH-LAPTOP2005/B 612 : It's a duplicate.
我想要对批处理文件执行的操作是提取
3rd space
和 3rd hyphen
之间的文本(不包括分隔符),第三个连字符位于第三个空格之后。对所有线路执行此操作。像这样:
5122-ABCD
612-DEFGH
sed
、awk
和 cut
等效项是:
cat file.txt | sed -E 's/^([^ ]*[ ]){3}//' | sed -E 's/(^([^-]*[-]){1}[^-]*).*/\1/'
cat file.txt | awk -F' ' '{print $4}' | awk -F'-' '{print $1 "-" $2}'
cat file.txt | cut -d ' ' -f 4- | cut -d '-' -f -2
但理想情况下,我应该引入第 n 次出现的空格和连字符的数字,而不是“硬编码”,就像 @SantiagoSquarzon 对 PowerShell 的回答:
$file = $Args[0]
$text = Get-Content $file
$text | Select-String '(?m)(?<=^(?:\S+\s){3})(?:[^-]+-){1}[^-]+' -AllMatches |
ForEach-Object { $_.Matches.Value } |
Sort-Object -Unique
这是我的解决方案。不排序或删除重复项,只是从每行提取
3rd space
和 3rd hyphen
之间的文本(不包括它们)。必须提供文本文件作为参数:
.\script.bat '.\in file.txt'
脚本.bat:
@echo off
set arg1=%1
for /f "tokens=*" %%a in (%arg1%) do call :processline %%a
pause
goto :eof
:processline
set line=%*
set var2=%line:* - =%
set var3=%var2:* =%
for /f "tokens=1,2 delims=-" %%a in ("%var3%") do (
set BEFORE_HYPHEN=%%a
set AFTER_HYPHEN=%%b
)
echo %BEFORE_HYPHEN%-%AFTER_HYPHEN%
goto :eof
:eof