从行号和列号中提取文本

时间:2012-11-23 10:30:56

标签: powershell batch-file

我尝试编写一个接受参数的脚本:

  • 行范围
  • 列范围

例如:cmd filename 1 5 12 87 其中1和5是行的范围 和12和87范围的列

我想从这些范围中提取文字。

我发现使用头部和尾部的线条,但我不知道如何选择相应的列。

仅适用于Windows :batch,powershell。


更新1

file.txt的

define('HTTP_REQUEST_METHOD_GET',     'GET',     true);
define('HTTP_REQUEST_METHOD_HEAD',    'HEAD',    true);
define('HTTP_REQUEST_METHOD_POST',    'POST',    true);
define('HTTP_REQUEST_METHOD_PUT',     'PUT',     true);
define('HTTP_REQUEST_METHOD_DELETE',  'DELETE',  true);
define('HTTP_REQUEST_METHOD_OPTIONS', 'OPTIONS', true);
define('HTTP_REQUEST_METHOD_TRACE',   'TRACE',   true);

cmd file.txt 1 3 19 27

输出

                  ST_METHOD_GET',     'GET',     true);
define('HTTP_REQUEST_METHOD_HEAD',    'HEAD',    true);
define('HTTP_REQUEST_METHO

我为第一行添加空白只是为了更好地表示。

事实上,脚本模拟从第X行开始到第Y行的文本选择(仅适用于第一行)和第Z列(仅适用于最后一行)

2 个答案:

答案 0 :(得分:2)

试试这个:

Function SelectTextRange( $path, $SL, $EL, $SS , $ES)
{
  $txt = gc $path
  $txt | select -First (($EL+1)-$SL) -Skip ($SL-1) |
     % { $_.substring( ($SS-1) ,($ES-$SS+1) )}
}

我了解列和行值是包含的值。

在您获得更准确的样本后,请尝试以下方法:

Function SelectTextRange( $path, $SL, $EL, $SS , $ES)
{
  $txt = gc $path
  $c = 0
  $txt[($sl+1)..($el+1)] | % { 

  if ($c -eq 0) { $_.substring($ss-1) } 
  if ($c -gt 0 -and $c -lt $txt[$sl..$el].count ) { $_}
  if ($c -eq ($txt[$sl..$el].count) ) { $_.substring(0,$es+1) } ;

  $c++
  }
}

答案 1 :(得分:2)

@echo off
setlocal EnableDelayedExpansion

set n=1
set /a start=%4-1
set /a len=%5-%4

for /f "usebackq delims=" %%a in ("%1") do (
  if !n! gtr %3 exit /b
  if not !n! lss %2 (
    set "row=%%a"
    echo !row:~%start%,%len%!
  )
  set /a n += 1
)

编辑:根据您的示例,我更新了我的答案,我认为您正在寻找:

@echo off
setlocal EnableDelayedExpansion

set n=1
set /a startc=%4-1
set /a endc=%5-1

for /f "usebackq delims=" %%a in ("%1") do (
  set "row=%%a"
  if !n! == %3 (
    if !n! == %2 echo !row:~%startc%,%endc%!
    if not !n! == %2 echo !row:~0,%endc%!
    exit /b
  )
  if !n! == %2  echo !row:~%startc%!
  if !n! gtr %2 echo !row!
  set /a n += 1
)