Скрипт для пакетного поиска и замены конкретного текста, а затем добавить 3 пробела после замененного текста в текстовом файле. - PullRequest
0 голосов
/ 28 сентября 2018

Я довольно новичок в написании сценариев и искал в интернете, но, похоже, не могу найти конкретного решения для того, чего я пытаюсь достичь, поэтому я надеюсь, что кто-то может пролить свет.

У меня есть файл .txt, который содержит различные строки данных, которые организованы по тексту, начиная с определенных номеров столбцов - в основном, таблицы данных.См. Пример ниже, в котором показано, где начинается каждый столбец:

 |            |                                      |
 |1214000     |1234567890                            |ISRBWPX0001000001
 |            |                                      |
 |MD-3300     |+12345678912                          |MDABWPX0001000001
 |            |                                      |
 |            |                                      |
 |            |                                      |
 Col:620      Col:632                                Col:672

Пожалуйста, нажмите здесь для скриншота, если приведенный выше пример не имеет смысла

Я хочу, чтобы скрипт нашел все строкикоторый содержит 'MD-' в столбце 620 и удалите его, чтобы осталось только число.Поэтому я запустил в PowerShell команду «Заменить», которая удалила все строки, содержащие «MD-», однако она выровняла остальные столбцы;

Используемая команда PowerShell:

(Get-Content "test.txt") | 
Foreach-Object {$_.replace("MD-", "")} | 
Set-Content "testedited.txt"

Вывод вышеуказанной команды:

 |            |                                      |
 |1214000     |1234567890                            |ISRBWPX0001000001
 |            |                                      |
 |3300     |+12345678912                          |MDABWPX0001000001
 |            |                                      |
 |            |                                      |
 |            |                                      |
 Col:620      Col:632                                Col:672

Щелкните здесь для скриншота, если приведенный выше пример не имеет смысла

Как вы можете видеть, +12345678912 больше не выравнивается по столбцу 632, а также'MDABWPX0001000001', который больше не выровнен по столбцу 672.

Можно ли выполнить указанную выше команду, не затрагивая другие столбцы?Я где-то читал, что хэш-таблицы могут сделать это, однако я не совсем понял метод.

Требуемый вывод:

 |            |                                      |
 |1214000     |1234567890                            |ISRBWPX0001000001
 |            |                                      |
 |3300        |+12345678912                          |MDABWPX0001000001
 |            |                                      |
 |            |                                      |
 |            |                                      |
 Col:620      Col:632                                Col:672

Пожалуйста, нажмите здесь, чтобы увидеть скриншот желаемого вывода

Я открыт для использования любых языков сценариев / методов длявыполнить эту задачу, так что любые предложения будут высоко оценены.

Заранее большое спасибо.

Ответы [ 3 ]

0 голосов
/ 28 сентября 2018
$_ -replace '(?<=.{620})MD-([0-9]+)',('$1'+' '*3)
0 голосов
/ 28 сентября 2018
@echo off
setlocal EnableDelayedExpansion

rem Change next line by 620 and 12
set /A "pos=11, wide=8"
set /A "posP3=pos+3, rest=wide-3, posPwide=pos+wide"

(for /F "delims=" %%a in (Input.txt) do (
   set "line=%%a"
   if "!line:~%pos%,3!" equ "MD-" (
      set "line=!line:~0,%pos%!!line:~%posP3%,%rest%!   !line:~%posPwide%!"
   )
   echo !line!
)) > Output.txt

Input.txt :

0123456789|asdf    |asdfdsaf
0123456789|MD-333  |asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqw    |asdfdsaf

Output.txt :

0123456789|asdf    |asdfdsaf
0123456789|333     |asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqw    |asdfdsaf
0 голосов
/ 28 сентября 2018

Это достаточно легко сделать с помощью регулярного выражения -relace.Я тестировал «MD», начиная с 11-го столбца.Измените его на 620 или на то, что ему нужно.

(Get-Content "test.txt") |
    ForEach-Object { $_ -replace '^(.{11})MD\-([^ ]*|)(.*)$', '$1$2   $3' } |
    Set-Content "testedited.txt"

Вот данные теста и образец.

PS C:\src\t\repmd> Get-Content .\test.txt
0123456789|asdf    |asdfdsaf
0123456789|MD-333  |asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqw    |asdfdsaf
PS C:\src\t\repmd> .\repmd.ps1
PS C:\src\t\repmd> Get-Content .\testedited.txt
0123456789|asdf    |asdfdsaf
0123456789|333     |asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqwasda|asdfdsaf
0123456789|cwqw    |asdfdsaf
0123456789|cwqw    |asdfdsaf

Регулярное выражение разбивается следующим образом.

^        beginning of string
(.{11})  capture 1 - eleven (11) characters
MD\-     literal 'MD-' (the '-' character needs to be escaped with \
([^ ]*|) capture 2 - all non-space characters until a VERTICAL LINE
(.*)     capture 3 - all remaining characters
$        end of string

'$1$2 $3' создает захваченные строки.Три (3) пробела перед $ 3 заменяют три (3) символа, заменяемых на 'MD -'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...