代码之家  ›  专栏  ›  技术社区  ›  Akhil Kintali

使用Windows命令行删除字符串中的某些字符

  •  1
  • Akhil Kintali  · 技术社区  · 6 年前

    我有一个文本文件,其中包含以下字符串:

    pub: 
    04:d6:b6:f2:98:ff:94:d8:3c:36:ad:5f:86:40:aa:
    d1:5a:e1:87:5d:55:9d:ad:8b:2b:fc:18:e7:bb:47:
    7f:9f:9a:62:c6:19:3a:9e:65:62:4e:5e:98:6d:db:
    0e:7d:f9:22:a3:ca:cb:12:b2:ed:eb:14:0c:b3:31:
    59:02:17:6d:6a
    

    我需要删除开头的04,还需要删除字符之间的“:”,并按如下方式打印,在一行中:

    d6b6f298ff94d83c36ad5f8640aad15ae1875d559dad8b2bfc18e7bb477f9f9a62c6193a9e65624e5e986ddb0e7df922a3cacb12b2edeb140cb3315902176d6a
    

    如何使用Windows命令执行此操作?

    2 回复  |  直到 6 年前
        1
  •  6
  •   Stephan    6 年前

    非常简单:

    @echo off
    setlocal enabledelayedexpansion
    set "first=true"
    (for /f "eol=p delims=" %%a in (input.txt) do (
      set "line=%%a"
      if defined first (set "line=!line:~2!" & set "first=")
      <nul set /p ".=!line::=!"
    ))>output.txt
    

    逐行读取输入文件。
    使用标志( first )检查第一行并移除前两个字符。
    移除冒号并
    使用 <nul set /p 不间断地写。

    编辑 正如注释中所示,您的文件实际上只有一行。这会将处理方式更改为:

    for /f %%a in (input.txt) do set "line=%%a"
    set "line=%line:pub:04:=%"
    set "line=%line::=%"
    echo %line%
    

    注意:变量只能保存一定数量的数据,因此当行超过此限制时,此方法将失败。

        2
  •  2
  •   Aacini    6 年前

    你的问题很令人困惑。你首先说: “我有一个包含以下字符串的文本文件:” ,但示例数据 六行 可以认为 六弦 ,因此在这一点上,我们不知道真正的数据格式是什么。也许你在这里写了一行长的话,分为六部分?

    接下来,你说 “我需要删除此开头的04” ,但如果数据 A. 04 一开始?也许您想删除 第一个元素 即使它不是 04 ?

    这样,我们必须 假定 为了尝试编写一个有效的解决方案,需要考虑以下几点。

    下面的批处理文件读取的文件 几行 去除 第一行 (即使不包含 pub: ),然后删除 第一个 冒号分隔的元素(即使不是 04 ):

    @echo off
    setlocal EnableDelayedExpansion
    
    rem Read all lines, excepting the first one:
    set "string="
    for /F "skip=1" %%a in (input.txt) do set "string=!string!%%a"
    
    rem Remove the first element:
    set "string=%string:*:=%"
    
    rem Show the rest, removing colons:
    echo %string::=%
    

    在这段代码中,还有其他隐含在命令工作方式中的假设,例如不包含空格或感叹号的行。当然,如果实际数据文件的格式不同,此程序将失败。。。