【发布时间】:2011-06-20 10:32:42
【问题描述】:
我有一个简单的文本文件,其中包含如下数字:
12345
45678
34567
89101
我需要一个能从该文件返回nth 行的批处理。 n 应取自命令行参数。
我对批处理脚本非常陌生,因此在此先感谢您提供的任何帮助。
【问题讨论】:
-
这是 windows 还是 unix?
标签: batch-file
我有一个简单的文本文件,其中包含如下数字:
12345
45678
34567
89101
我需要一个能从该文件返回nth 行的批处理。 n 应取自命令行参数。
我对批处理脚本非常陌生,因此在此先感谢您提供的任何帮助。
【问题讨论】:
标签: batch-file
要从第 n 行获取文件,您可以使用 more +n(对于第 1 行是 n=0)。
要拆分文件的其余部分,您可以使用 FOR /F 循环。
即使在第 n 行之前有空行,这也有效。
可能需要将 EOL 设置为未使用的字符或换行(默认为 ;)
set "lineNr=%1"
set /a lineNr-=1
for /f "usebackq delims=" %%a in (`more +%lineNr% text.txt`) DO (
echo %%a
goto :leave
)
:leave
【讨论】:
eol 设置为换行符?
您可以使用批处理文件扩展名。
token.bat
@echo off
setlocal ENABLEDELAYEDEXPANSION
set l=%1
set c=0
for /f "delims=" %%1 in ('type foo.txt') do (
set /a c+=1 && if "!c!" equ "%l%" echo %%1%
)
如果你有如下文件,
foo.txt
AAAA
BBBB
CCCC
DDDD
并指定行号,如下所示
token 3
你会得到
CCCC
【讨论】:
` and n`?
!,有时还删除了^
! 被删除,因为延迟扩展已启用,只有禁用扩展您才能安全访问%%1 另请参阅Script to remove special characters from filenames
您可以将FOR /F 与skip 参数一起使用:
@ECHO OFF
SET skip=%1
SET /A skip-=1
IF %skip% LSS 0 GOTO out
IF %skip% GTR 0 SET params="skip=%skip%"
FOR /F %params% %%L IN (filename) DO (SET "line=%%L"& GOTO out)
:out
ECHO %line%
skip 参数表示FOR /F 循环必须在开头跳过指定的行数。该参数仅在您指定大于 1 的行号时应用。如果您指定小于 1 的数字或非数字,则脚本输出空字符串。
【讨论】:
+1 为 Jeb 的解决方案...我没有意识到您可以使用 more 命令来跳过这样的行!
这是我用来从文件(或从另一个程序的多行输出)中获取特定行的另一种方法:
@echo off
for /f "tokens=1* delims=:" %%a in ('findstr /n .* "C:\SomeFile.txt"') do (
if "%%a" equ "%1" echo.%%b
)
我使用 findstr /n .* "Path\FileName.ext" 来添加行号,并确保 for 循环不会跳过空行。
然后我设置 "tokens=1* delims=:" 将行号与行内容分开。
最后,我将当前行号(%%a)与%1参数指定的行进行比较,并回显行内容(% %b) 在比赛中。
【讨论】:
@echo off
REM Next line = Set command value to a file OR Just Choose Your File By Skipping The Line
vol E: > %temp%\justtmp.txt
REM Vol E: = Find Volume Lable Of Drive E
REM Next Line to choose line line no. +0 = line no. 1
for /f "usebackq delims=" %%a in (`more +0 %temp%\justtmp.txt`) DO (set findstringline=%%a& goto :nextstep)
:nextstep
REM Next line to read nth to mth Character here 22th Character to 40th Character
set result=%findstringline:~22,40%
echo %result%
pause
exit /b
另存为查找标签.cmd
结果将是您的 Drive E 标签
享受
【讨论】:
根据 Amit 的回答,我制作了一个名为 snip.cmd 的实用程序。
用法:剪切文件行第一个字符最后一个字符
示例:
foo.txt
//
// File Checksum Integrity Verifier version 2.05.
//
77752e4c91ba96dcc6c2bb4bdcdbdec5 c:\users\lapinot\desktop\token.bat
snip foo.txt 3 0 33 将产生 77752e4c91ba96dcc6c2bb4bdcdbdec5
这是我的 snipe.cmd 代码(您可以通过将 snip.cmd 复制到 c:\Windows\System32 来将 snipe 添加到命令行):
@echo off
:: USAGE
:: snip <file> [Line - Starts at 0] [First Column - Start Count at 0] [Last Colum]
set file=%1
set line=%2
set char1=%3
set char2=%4
for /f "usebackq delims=" %%a in (`more +%line% %file%`) DO (set findstringline=%%a& goto :nextstep)
:nextstep
echo echo %%findstringline:^~%char1%,%char2%%% > %temp%\result.bat
%temp%\result.bat
del %temp%\result.bat
:EOF
exit /b
【讨论】:
echo "enter the line number.."; read i; awk 'NR==$i' <file_name>;
【讨论】: