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