如何使用命令提示符或批处理文件从字符串中删除某些字符?

Posted

技术标签:

【中文标题】如何使用命令提示符或批处理文件从字符串中删除某些字符?【英文标题】:How to remove certain characters from a string using command prompt or batch file? 【发布时间】:2020-07-13 15:12:36 【问题描述】:

我的名字是 Syarz,我是编程新手。我想知道如何使用 cmd 或批处理文件从字符串中删除字符。

这是 data.txt 文件中的字符串:

test.rar:$rar5$16$b19108e5cf6a5dadaa0ff515f59c6df7$15$f7f4933a2a8f7aa43d7fc31e86c47e2b$8$307ef2987e735bec

在 data.txt 中运行命令或批处理文件后我想要这个

$rar5$16$b19108e5cf6a5dadaa0ff515f59c6df7$15$f7f4933a2a8f7aa43d7fc31e86c47e2b$8$307ef2987e735bec

我尝试了网站上提供的一些方法,但似乎没有一个对我有用。他们要么删除整个字符串,要么删除我不想删除的部分。

我已经尝试过的

1 -

more +1 "data.txt" > "data_NEW.txt"

2 -

@echo off
(
    for /F usebackq^ skip^=1^ delims^=^ eol^= %%L in ("data.txt") do echo(%%L
) > "data_NEW.txt"

3-

@echo off
(
    for /F "skip=1 delims=" %%L in ('findstr /N "^" "data.txt"') do (
        set "LINE=%%L"
        setlocal EnableDelayedExpansion
        echo(!LINE:*:=!
        endlocal
    )
) > "data_NEW.txt"

4 -

@echo off
for /F %%C in ('find /C /V "" ^< "data.txt"') do set "COUNT=%%C"
setlocal EnableDelayedExpansion
(
    for /L %%I in (1,1,%COUNT%) do (
        set "LINE=" & set /P LINE=""
        if %%I gtr 1 echo(!LINE!
    )
) < "data.txt" > "data_NEW.txt"
endlocal

5 -

void chopN(char *str, size_t n)

    assert(n != 0 && str != 0);
    size_t len = strlen(str);
    if (n > len)
        return;  // Or: n = len;
    memmove(str, str+n, len - n + 1);

6 -

void chopN(char *str, size_t n) 
  char *dest = str;

  // find beginning watching out for rump `str`
  while (*str && n--) 
    str++;
  

  // Copy byte by byte
  while (*src) 
    *dest++ = *src++;
  

  *dest = '\0';

7 -

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

8 -

@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

只是想学点新东西。 谢谢大家。

【问题讨论】:

如果你想要cmd或者批处理文件,为什么要标记这个PowerShell 不错的密码转储文件 btw... 在 Powershell 中:gc data.txt | % $_.Split(':')[1] for /f "tokens=2 delims=:" %%a in (data.txt) do echo %%a ? Select-String -Path C:\src\t\sstext.txt -Pattern '(.*):(.*)' | ForEach-Object $_.Matches.Groups[2].Value for /f "tokens=2 delims=:" %%a in (data.txt) do echo %%a &gt;&gt; data1.txt 应该可以工作(但会在每一行添加一个额外的空间)。或(for /f "tokens=2 delims=:" %%a in (data.txt) do echo %%a) &gt; data1.txt 来避免这种情况(并且对于大文件会更快) 【参考方案1】:

嗯,您的许多尝试(#1 到 #4)似乎都删除了输入文本的第一行。 #7 和 #8 可能更接近您想要的,但这些方法不适合您的样本数据。而且#5 和#6 绝对不是批处理文件。

要在某个字符处拆分文本,即您的情况下的冒号,只需使用for /F loop:

for /F "tokens=1,2 delims=:" %%I in (data.txt) do (
    echo 1st token: %%I
    echo 2nd token: %%J
)

如果第二部分可以单独包含您想要保留的冒号,您需要将标记 2 更改为 *,这意味着“所有其余部分”:

for /F "tokens=1,* delims=:" %%I in (data.txt) do (
    echo 1st token: %%I
    echo remainder: %%J
)

考虑到for /F 循环将多个相邻的分隔符组合成一个,因此像abc::def 这样的字符串将被拆分为abcdef 部分。另请注意,前导分隔符已被删除,因此:abc::def 之类的字符串也将被拆分为abcdef 部分。换句话说,for /F 不会返回空令牌。

【讨论】:

由于我是编程新手,我无法弄清楚这些代码对我自己意味着什么。感谢您的帮助和解释。【参考方案2】:

我知道您要求批处理,但我没有提供批处理答案,所以我会回复帮助您批处理答案的人。

这是 PowerShell 的一种简单方法:

$f = Get-Content data.txt
$out = 'data2.txt'

$f | ForEach-Object  
    $_.Split(':')[1] 
 | Out-File $out -Append

【讨论】:

谢谢,它成功了。我可以在 PowerShell 控制台中使用批处理文件运行它吗?我的意思是如何在 PowerShell 中同时运行这些命令? @SyarzAsterisk,将其保存到文件 myscript.ps1,然后使用 PowerShell 执行:powershell.exe -File path-to\myscript.ps1

以上是关于如何使用命令提示符或批处理文件从字符串中删除某些字符?的主要内容,如果未能解决你的问题,请参考以下文章

如何从一行中删除某些单词,但将其余部分放入带有批处理的字符串/变量中?

如何用cmd命令强制删除文件夹?

批处理之命令重定向操作

从键盘上输入任意一个字符,求出它的ASCII码并输出

如何从linux下删除文件夹

从批处理文件中删除带有通配符的文件夹 Windows 7