我尝试编写一个接受参数的脚本:
例如: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列(仅适用于最后一行)
答案 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
)