我有包含以下内容的文本文件
Pool p c Dev Dev Total Enabled Used Free a b
------------ - - ----- ------------ -------- -------- -------- -------- --- ---
FC100 T F FBA RAID-3(1+1) 13849.1 13849.1 13119.4 7292.0 0 Ena
SATA500 T S FBA RAID-3(1+1) 50019.2 50019.2 46974.5 3044.9 Ena 0
我想从文件中显示提取FC100和SATA500,因为这两行包含“Ena”。我的批处理脚本经验非常少,所以凭借我的有限知识,我想出了以下脚本。
@ECHO OFF
setlocal enabledelayedexpansion
FOR /F "tokens=1,* delims= " %%a in (list.txt) DO (
if "%%b" NEQ "" (
set string=%%b
set substring= Ena
echo !string! |findstr "!substring!" > nul
if errorlevel 1 (
rem echo !SubString!
) else (
echo %%a
)
)
)
上面的代码发生了什么,我得到了所需的输出,但我也得到了Pool,因为该行包含Ena in Enabled。如何提取仅包含Ena且与Enabled不匹配的行。
当前输出
Pool
FC100
SATA500
我尝试使用一些正则表达式魔法与findstr但它不适合我。 注意 - 我可以在Perl中解决这个问题,但遗憾的是我无法在系统上安装Perl,因此我必须批量执行此操作。
答案 0 :(得分:3)
@echo off
for /F "skip=1" %%a in ('findstr /C:" Ena" list.txt') do (
echo %%a
)
编辑: 在任何部分使用“Ena”字符串精确搜索行的新解决方案
@echo off
for /F %%a in ('findstr /R /C:"\<Ena\>" list.txt') do (
echo %%a
)
答案 1 :(得分:2)
您可能希望将Ena
作为整个单词进行匹配。为此,您可以使用\<
和\>
包围搜索字词,即更改substring
分配,如下所示:
set "substring=\<Ena\>"
顺便说一句,在循环的每次迭代中,可能都不需要将substring
赋值给相同的值。你可以在循环之前只分配一次。
答案 2 :(得分:0)
试试这个:
set substring="Ena[^a-zA-Z]"
[^a-zA-Z]
指示findstr
不要在Ena
之后使用包含字母的字符串。
答案 3 :(得分:0)
替换
echo !string! |findstr "!substring!" > nul
带
echo !string! |findstr "!substring!" |findstr /v "Enabled" > nul
甚至更简单:
echo !string! |findstr "Ena" |findstr /v "Enabled" > nul
第一个findstr
将包含所有包含“Ena”的行,第二个findstr /v
将排除所有包含“已启用”的行。