powershell 在字符串后从文本文件导入数据
powershell import data from text file after string
网络上似乎有类似的问题,虽然答案各不相同,但我无法得到我想要的结果。
下面只是在文件末尾追加txt文件中的内容
Add-Content -Path "HeartBeat.txt" -Value (Get-Content "insertme.txt")
尽管我想使用 powershell 在文本文件中查找字符串,然后在找到该字符串后从另一个文本文件复制内容。
文本文件搜索字符串的虚假示例 "HeartBeat"
<xml>
<Server>
<HeartBeat>1</HeartBeat>
</Server>
还有另一个名为 "insertme.txt" 的文本文件,它将在 "HeartBeat"
之后另起一行插入其内容
<dummydata>
<port></port>
<ipaddress></ipaddress>
添加后将
<xml>
<Server>
<HeartBeat>1</HeartBeat>
<dummydata>
<port></port>
<ipaddress></ipaddress>
</Server>
如有任何帮助,我们将不胜感激。
谢谢
如果您想要一个真正稳健 的解决方案,请使用 XML 处理,PowerShell 通过 [xml]
(System.Xml.XmlDocument
) .NET type.
支持
如果您仍然想要纯文本解决方案,请尝试以下操作(PSv3+;将两个文件全部读入内存;我在代码中使用了仅 LF 换行符("`n"
);如果您想要 CRLF 换行符,请将其替换为 "`r`n"
):
(Get-Content -Raw Heartbeat.txt) -replace
'(?m)^.*<HeartBeat>.*$',
('$&' + "`n" + (Get-Content -Raw InsertMe.txt).TrimEnd() -replace '(?m)^', ' '))|
Set-Content HeartBeat.txt # PSv5+: Add -NoNewline to avoid extra newline
注意:唯一可以读取Heartbeat.txt
并写回[=66]的唯一原因=] 在单个管道中,由于 Get-Content
命令周围的 (...)
,其内容被预先完整读入内存。
虽然这种方法很方便,但它也有轻微的数据丢失风险,如果在所有内容写回文件之前管道中断,就会发生这种情况。
Get-Content -Raw
将文件作为 单个字符串 .
完整读入内存
正则表达式 '(?m)^.*<HeartBeat>.*$'
匹配包含子字符串 <HeartBeat>
的单行(注意 -replace
运算符通常查找 multiple 匹配)
替换表达式 '$&' + "`n" + (Get-Content -Raw InsertMe.txt).TrimEnd()
将匹配行替换为自身 ($&
),后跟换行符和文件内容 InsertMe.txt
.
.TrimEnd()
用于删除尾随的换行符(和一般的空格),以便插入不会因文件是否恰好以换行符结尾而有所不同。
如果你想避免在更新后的文件末尾出现额外的换行符,
使用 Set-Content -NoNewline
,但请注意,这需要 PSv5+。
在早期版本中,您可以将 .TrimEnd()
应用于整个表达式,然后再将其发送到 Set-Content
.
如果要修改插入以对插入内容的每一行应用a 固定缩进:
(Get-Content -Raw Heartbeat.txt) -replace
'(?m)^.*<HeartBeat>.*$',
('$&' + "`n" + (Get-Content -Raw InsertMe.txt).TrimEnd() -replace '(?m)^', ' '))|
Set-Content HeartBeat.txt # PSv5+: Add -NoNewline to avoid extra newline
网络上似乎有类似的问题,虽然答案各不相同,但我无法得到我想要的结果。
下面只是在文件末尾追加txt文件中的内容
Add-Content -Path "HeartBeat.txt" -Value (Get-Content "insertme.txt")
尽管我想使用 powershell 在文本文件中查找字符串,然后在找到该字符串后从另一个文本文件复制内容。
文本文件搜索字符串的虚假示例 "HeartBeat"
<xml>
<Server>
<HeartBeat>1</HeartBeat>
</Server>
还有另一个名为 "insertme.txt" 的文本文件,它将在 "HeartBeat"
之后另起一行插入其内容<dummydata>
<port></port>
<ipaddress></ipaddress>
添加后将
<xml>
<Server>
<HeartBeat>1</HeartBeat>
<dummydata>
<port></port>
<ipaddress></ipaddress>
</Server>
如有任何帮助,我们将不胜感激。
谢谢
如果您想要一个真正稳健 的解决方案,请使用 XML 处理,PowerShell 通过 [xml]
(System.Xml.XmlDocument
) .NET type.
如果您仍然想要纯文本解决方案,请尝试以下操作(PSv3+;将两个文件全部读入内存;我在代码中使用了仅 LF 换行符("`n"
);如果您想要 CRLF 换行符,请将其替换为 "`r`n"
):
(Get-Content -Raw Heartbeat.txt) -replace
'(?m)^.*<HeartBeat>.*$',
('$&' + "`n" + (Get-Content -Raw InsertMe.txt).TrimEnd() -replace '(?m)^', ' '))|
Set-Content HeartBeat.txt # PSv5+: Add -NoNewline to avoid extra newline
注意:唯一可以读取Heartbeat.txt
并写回[=66]的唯一原因=] 在单个管道中,由于 Get-Content
命令周围的 (...)
,其内容被预先完整读入内存。
虽然这种方法很方便,但它也有轻微的数据丢失风险,如果在所有内容写回文件之前管道中断,就会发生这种情况。
Get-Content -Raw
将文件作为 单个字符串 . 完整读入内存
正则表达式
'(?m)^.*<HeartBeat>.*$'
匹配包含子字符串<HeartBeat>
的单行(注意-replace
运算符通常查找 multiple 匹配)替换表达式
'$&' + "`n" + (Get-Content -Raw InsertMe.txt).TrimEnd()
将匹配行替换为自身 ($&
),后跟换行符和文件内容InsertMe.txt
..TrimEnd()
用于删除尾随的换行符(和一般的空格),以便插入不会因文件是否恰好以换行符结尾而有所不同。
如果你想避免在更新后的文件末尾出现额外的换行符,
使用Set-Content -NoNewline
,但请注意,这需要 PSv5+。
在早期版本中,您可以将.TrimEnd()
应用于整个表达式,然后再将其发送到Set-Content
.
如果要修改插入以对插入内容的每一行应用a 固定缩进:
(Get-Content -Raw Heartbeat.txt) -replace
'(?m)^.*<HeartBeat>.*$',
('$&' + "`n" + (Get-Content -Raw InsertMe.txt).TrimEnd() -replace '(?m)^', ' '))|
Set-Content HeartBeat.txt # PSv5+: Add -NoNewline to avoid extra newline