Как удалить определенные символы из строки, используя командную строку или командный файл? - PullRequest
0 голосов
/ 01 апреля 2020

Меня зовут Сярц, и я новичок в программировании. Я хочу знать, как удалить символы из строки, используя 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

Просто пытаюсь узнать что-то новое. Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 08 апреля 2020

Что ж, многие из ваших попыток - с # 1 по # 4 - похоже, удаляют первую строку входного текста. № 7 и № 8 могут приблизиться к тому, что вы хотите, но эти подходы не подходят для ваших данных образца. И # 5 и # 6 определенно не являются пакетными файлами.

Чтобы разделить текст по определенному символу, а именно по двоеточию в вашей ситуации, просто используйте for /F l oop:

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 l oop объединяет несколько смежных разделителей в один, следовательно, строка типа abc::def будет разбита на части abc и def. Также обратите внимание, что ведущие разделители удаляются, поэтому строка типа :abc::def также будет разбита на части abc и def. Другими словами, for /F не возвращает пустые токены.

0 голосов
/ 02 апреля 2020

Я понимаю, что вы запросили пакет, но я не предоставляю пакетный ответ, поэтому я отвечу тем, кто помогал вам с пакетным ответом.

Вот простой способ сделать это PowerShell:

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

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