我试图弄清楚如何将字符串附加到文件中特定行的末尾。
示例文件:
n
我不知道" LineToAppendTo"的行号。线。我所知道的是,该行以文本" LineToAppendTo"开头。然后是一堆我不知道或不关心的随机文本。我想要做的就是附加一个字符串",attachedString"到那条线的尽头。
使用上面给出的示例输出将是:
Some text
...
LineToAppendTo,otherrandomtext,...,endoflinetext
...
End of file text
我如何做到这一点是powershell(如果不是powershell,我也可以使用批处理)?
答案 0 :(得分:2)
你可以使用这个功能,我已经测试了它的功能。函数AppendToFile
包含2个参数PathToFile
和TextToAdd
。如果您有任何问题,请告诉我们!
Function AppendToFile {
param([String]$PathToFile, [String]$TextToAdd)
$lines = Get-Content $PathToFile | Where {$_ -notmatch '^\s+$'}
foreach ($line in $lines) {
if ($line -like "LineToAppendTo*") {
$lines[$lines.IndexOf($line)] += $TextToAdd
}
}
$lines | Set-Content $PathToFile
}
# example use of function
AppendToFile -PathToFile "C:\myTextFile.txt" -TextToAdd "add this"
从此处的解决方案进行了修改:Add-Content - append to specific line
答案 1 :(得分:2)
(gc D:\in.txt) -replace '^LineToAppendTo.*', '$0,AppendText' | sc d:\out.txt
获取行,将“LineToAppendTo”替换为自己的行,然后加上“,AppendText”(其他行保持不变)。将行输出到文件。
如果您不想使用正则表达式,您可以轻松地:
gc D:\in.txt |% {
if ($_.StartsWith('LineToAppendTo')) {"$_,AppendText"} else {$_}
} | sc d:\out.txt
-
gc
Get-Content
和sc
Set-Content
。-replace
作用于数组中每个项目的事实。%
作为ForEach-Object
来明确循环每一行。答案 2 :(得分:1)
以下是batch-file解决方案:
@echo off
setlocal EnableExtensions DisableDelayedExpansion
rem // Define constants here:
set "FILE=%~1"
set "PREFIX=LineToAppendTo"
set "SUFFIX=,appendedString"
for /F "usebackq delims=" %%L in ("%FILE%") do (
set "LINE=%%L"
setlocal EnableDelayedExpansion
for /F "tokens=1 delims=," %%S in ("!LINE:*:=!") do (
endlocal
set "STRING=%%S"
setlocal EnableDelayedExpansion
if "!STRING!"=="!PREFIX!" (
echo(!LINE!!SUFFIX!
) else (
echo(!LINE!
)
)
endlocal
)
endlocal
exit /B
作为命令行参数给出的文本文件由for /F
循环逐行读取。每一行在第一个,
处拆分,其前面的部分与前缀LineToAppendTo
进行比较。如果相等,则输出后缀为,appendedString
的行;如果没有,该行未经编辑输出。
如果要将输出存储到文件中,请使用重定向,假设脚本名为append.bat
:
append.bat "\path\to\input_file.txt" > "\path\to\output_file.txt"