用于批量查找和替换特定文本的脚本,然后在.txt文件中的替换文本之后添加3个空格

时间:2018-09-27 23:31:37

标签: powershell batch-file text fixed-width

我对脚本编写还很陌生,并且已经在Internet上进行了搜索,但是似乎找不到针对我要实现的目标的特定解决方案,所以我希望有人可以帮忙一下。

我有一个.txt文件,其中包含各种数据行,这些数据行是根据特定的列号(基本上是一个数据表)从文本开始组织的。请参见下面的示例,其中显示了每一列的起始位置:

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

Please click here for screenshot if above example makes no sense

我希望脚本在第620列中找到所有包含“ MD-”的行并将其删除,因此仅保留数字。因此,我在PowerShell中运行了Replace命令,该命令确实删除了所有包含“ 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

Click here for screenshot if above example makes no sense

如您所见,'+ 12345678912'不再与632列对齐,并且'MDABWPX0001000001'不再与672列对齐。

是否有一种方法可以执行上述命令而不影响其他列?我读到某个地方哈希表可以做到这一点,但是我并不完全理解该方法。

所需的输出:

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

Please click here to see screenshot of desired output

我愿意使用任何脚本语言/方法来执行此任务,因此任何建议将不胜感激。

非常感谢您。

3 个答案:

答案 0 :(得分:1)

使用-replace正则表达式很容易做到这一点。我从第11列开始使用“ MD”进行了测试。将其更改为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)个空格用'MD-'代替三(3)个字符。

答案 1 :(得分:1)

$_ -replace '(?<=.{620})MD-([0-9]+)',('$1'+' '*3)

答案 2 :(得分:0)

@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