批量包含/排除所有行中第 n 个字符和第 n 个不同字符之间的文本

问题描述 投票:0回答:1

我想做这个:

使用 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
batch-file
1个回答
0
投票

这是我的解决方案。不排序或删除重复项,只是从每行提取

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
© www.soinside.com 2019 - 2024. All rights reserved.