【问题标题】:Is there a way to search a file, replace some text inside the file and only save the edited text有没有办法搜索文件,替换文件内的一些文本,只保存编辑过的文本
【发布时间】:2019-04-12 04:29:18
【问题描述】:

我想制作自己的小型加密和解密工具。我已经有了加密脚本和“数据库”,我现在只需要解密工具。现在出现了 PowerShell 脚本。我在一个文本文件中有多个字符串,其中保存了我的加密密码,脚本应该在文本文件中搜索这些字符串并将它们替换为密码,而不仅仅是编辑后的文本(解密密码)需要保存在另一个文件中.有没有办法用 PowerShell 做到这一点?

我试过-replace,但只更改了一个字符串,文件的其余部分也保存了

$1  = "abc"
(Get-Content Text.txt) | ForEach-Object { $_ -replace $1, "`na" } | Set-Content EditedText.txt

$2  = "def"
(Get-Content Text.txt) | ForEach-Object { $_ -replace $2, "`nb" } | Set-Content EditedText.txt

【问题讨论】:

  • 你的问题不清楚,你想保存,匹配模式的行匹配模式还是替换?请收下tour并阅读How to Ask
  • 我有一个文本文件,我想在这个文本文件中搜索一个特定的字符串,我想用“X”替换那个字符串,而不是将替换保存到另一个文件中
  • 替换为X 只需保存X 即可;-)。说真的:你还不清楚。 Edit 包含附加信息的问题。 请拨打tour 并阅读How to Ask

标签: powershell replace


【解决方案1】:

我假设这是你想要做的。

(Get-Content -Path Text.txt -Raw).Replace($1, "'na").Replace($2, "'nb") | Out-File EditedText.txt

-Raw 标志将返回一个字符串对象而不是字符串[],并且 .Replace(valueToReplace, newValue) 方法是字符串类的一部分。最后,Out-File 会将其输出到一个新文件中。如果要将其附加到现有文件,请使用 Out-File 命令上的 -Append 开关。否则,它只会覆盖存在的文件。

【讨论】:

  • 值得指出的是,PowerShell 永远不会保留输入文件编码,并且您在没有 -Encoding 的情况下使用 Out-File 将导致 Windows PowerShell 中出现“Unicode”(UTF-16LE)文件,这可能是不受欢迎的。 Set-Content 默认为活动的 ANSI 代码页; Set-Content 通常是(稍微)更有效的选择来保存已经是字符串的输入。 (在 PowerShell Core 中,一致的默认编码是没有 BOM 的 UTF-8)。
  • .Replace 有时会跳过一些替换。初始文本是“abcda”,最终文本是“acda”,有没有办法解决这个问题。
  • @DasBoss 我相信 .Replace() 区分大小写。那是问题吗?它不应该跳过任何东西。
  • 顺便说一句,通常你不希望有密码解密机制。您只需每次加密纯文本并将其与保存的加密密码进行比较。基本上,密码散列就是我们所说的。除非您有理由拥有纯文本密码,否则我什至不会担心解密它。
  • @PatrickMcvay 我担心的跳过现在消失了,是加密脚本有问题,但不明显。
猜你喜欢
  • 2016-09-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-12
  • 2016-09-22
  • 1970-01-01
  • 1970-01-01
  • 2020-03-02
  • 1970-01-01
相关资源
最近更新 更多