【问题标题】:Display Line (n) in a text file In Command Prompt在命令提示符中的文本文件中显示行 (n)
【发布时间】:2018-05-23 14:46:40
【问题描述】:

我的文本文件包含 23 行(行包括:!@$:/;")

如何只显示第 3 行?在还是 7?还是 19 岁?

我试过所有命令都在stackoverflow中

例子:

setlocal enabledelayedexpansion
@echo off
for /f "delims=" %%i in (mytext.txt) do (
if 1==1 (
set first_line=%%i
echo !first_line!
goto :eof
))

只显示第一行

【问题讨论】:

标签: batch-file command-line cmd


【解决方案1】:

@Compo 给出了一个很好的答案。这只是对其进行阐述。不应将使用 GC 之类的别名放入脚本中。当然,在命令行中,如果您愿意,可以继续减少输入。此外,拼出参数名称可提供更多信息并有助于更快地理解。

只获取第 3 行。

GC .\mytext.txt -T 3|Select -L 1

Get-Content -Path '.\mytext.txt' -TotalCount 3 | Select-Object -Last 1

从 CMD 控制台(命令提示符):(仅获取第七 (7) 行

PowerShell "GC .\mytext.txt -T 7|Select -L 1"

PowerShell -NoProfile "Get-Content -Path '.\mytext.txt' -TotalCount 7 | Select-Object -Last 1"

获取第 3 到 7 行:

$FirstLine = 3
$LastLine=7
powershell -NoProfile -Command "Get-Content -Path '.\t.txt' -TotalCount $LastLine | Select-Object -Last ($LastLine - $FirstLine + 1)"

或者,在 cmd.exe 批处理脚本中。

SET "FIRSTLINE=3"
SET "LASTLINE=7"
powershell -NoProfile -Command ^
    "Get-Content -Path '.\t.txt' -TotalCount %LASTLINE% |" ^
        "Select-Object -Last (%LASTLINE% - %FIRSTLINE% + 1)"

【讨论】:

  • 从 cmd.exe 批处理脚本调用 PowerShell 时,如上一个示例所示,如果一行超过 80 个字符,则会在输出的第 80 位自动插入换行符。我怎样才能避免这种情况?在我的特定用例中,我将 PowerShell 命令的输出通过管道传输到 CLIP,并且在粘贴时不希望添加换行符。
  • 我在使用 PowerShell 5.1.14409.1012 的 Windows 7 Enterprise SP1 上似乎没有这个结果。
【解决方案2】:
@echo off
setlocal
set "FILE_TO_PROCESS=%~f1"
set /a LINE_NUMBER=%~2
set /a trim=LINE_NUMBER-1

break>"%temp%\empty"&&fc "%temp%\empty" "%FILE_TO_PROCESS%" /lb  %LINE_NUMBER% /t |more +4 | findstr /B /E /V "*****"|more +%trim%
endlocal

试试这个bat(称为lineNumber.bat)第一个参数是你要处理的文件第二个是行号:

call lineNumber.bat someFile.txt 5

【讨论】:

  • 哇,这是一些 cmd Fu!感谢您结束我让 findstr 工作的努力。我希望我能弄清楚如何将这种魔法与获得最后一个词(也许是for /f "tokens=2" %%a in (state.txt) do set word1=%%a 的一些变体)混合在一起
  • @deasserted - 你想要最后一句话吗?这也可以实现,尽管在评论中回答您不会那么方便。
  • @deasserted - 这是困扰你的事情吗? stackoverflow.com/questions/60675577/…
  • 是的,我用你的方法解决了这个问题。我终于使用了你的解决方案,用set /p line=<"%temp%\empty" 重新读回它,然后使用for %%a in (!line!) do set last_phrase=%%a 和EnableDelayedExpansion 得到最后一个短语。谢谢!
  • 只是为了帮助其他人理解在这个答案中做了什么:break> 部分创建一个空文件(可能是它自己的行)。它与 FC(文件比较)实用程序一起用于裁剪 /lb LINE_NUMBER 之后的所有行。它可以工作,但它的报告需要清理:所以 MORE +4 在 LINE_NUMBER 之前裁剪 FC 结果,并且 findstr 找到其中没有 ***** 的行。我不确定为什么需要最后一个 MORE,但我认为它可以处理角落案例。如果你想保存结果,点击 >my_filename 来保存它,然后set /p my_line=<"my_filename " 把它读回来。
【解决方案3】:

有几种方法可以做到这一点。您的第一个选择是正常执行 for 循环,并在到达所需行后跳出循环。

@echo off

:: Specify which line to return
set get_line=7

:: Skip all lines before it, then print the next line and abort
set /a get_line-=1
for /F "skip=%get_line% delims=" %%A in (mytext.txt) do (
    echo %%A
    goto :end_loop
)

:end_loop

您的另一个选择是将不需要的行之前的所有行存储在临时变量中,然后显示下一行。

@echo off
setlocal enabledelayedexpansion

:: Specify which line to return
set get_line=7

:: Skip all lines before it, then print the next line and abort
set /a get_line-=2

(
    for /L %%A in (0,1,%get_line%) do set /p skip_line=
    set /p return_line=
) <file.txt

echo !return_line!

请注意,第一个选项不适合返回脚本的第一行。

【讨论】:

    【解决方案4】:

    既然你说'展示',何不试试PowerShell

    从 PowerShell 控制台:

    GC .\mytext.txt -T 3|Select -L 1
    

    从 CMD 控制台(命令提示符)

    PowerShell "GC .\mytext.txt -T 7|Select -L 1"
    

    来自批处理文件:

    @(PowerShell "GC .\mytext.txt -T 19|Select -L 1"&Pause)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-03
      • 1970-01-01
      • 2020-09-21
      • 2014-01-04
      • 1970-01-01
      相关资源
      最近更新 更多