更改字符串的特定部分

时间:2014-08-22 18:20:14

标签: powershell

我有一个.txt文件,里面有一些文字:

Property;Value
PKG_GUID;"939de9ec-c9ac-4e03-8bef-7b7ab99bff74"
PKG_NAME;"WinBasics"
PKG_RELATED_TICKET;""
PKG_CUSTOMER_DNS_SERVERS;"12314.1231
PKG_CUSTOMER_SEARCH_DOMAINS;"ms.com"
PKG_JOIN_EXISTING_DOMAIN;"True"
PKG_DOMAINJOIN_DOMAIN;"ms.com"
PKG_DOMAINJOIN_USER;"mdoe"
PKG_DOMAINJOIN_PASSWD;"*******"

现在,有没有办法用以下方法替换那些*数字或某事? 如果是的话,你能告诉我怎么做吗?

4 个答案:

答案 0 :(得分:0)

如果您使用的是Powershell V2.0(希望如此),您可以尝试以下内容。 gcget-content命令行开关的简写。

(gc D:\SO_Test\test.txt) -replace '\*+','12345678'

使用此结果数据如下(注意最后一行)

Property;Value 
PKG_GUID;"939de9ec-c9ac-4e03-8bef-7b7ab99bff74" 
<Rest of the lines here> 
PKG_DOMAINJOIN_USER;"mdoe" 
PKG_DOMAINJOIN_PASSWD;"12345678" <-- Notice here; *'s changed to numbers

答案 1 :(得分:0)

Rahul的答案很好,我只想提一下* +将替换单个*字符或更多字符的所有实例,因此它可以匹配任何其他地方至少有一颗星。如果您发布的内容是您所期望的样本数据,尽管这样会很好。

您可以更改正则表达式匹配,以便在需要时通过将其更改为

来使其更具体
\*{3,0} 

将匹配3颗或更多颗星,或非常具体的

(?<=")\*{3,}(?=") 

将取代3个或更多被双引号包围的恒星。

答案 2 :(得分:0)

这是一个函数,它使用正则表达式前瞻和后观零长度断言来替换类似于您的示例的字符串中的命名参数:

function replace-x( $string, $name, $value ) {
   $regex = "(?<=$([regex]::Escape($name));`").*(?=`")"
   $string -replace $regex, $value
   }

它可以重复使用文件中的不同设置,例如:

$settings = get-content $filename
$settings = replace-x $settings PKG_DOMAINJOIN_USER foo
$settings = replace-x $settings PKG_DOMAINJOIN_PASSWD bar

答案 3 :(得分:0)

就像Rahul一样,我也会使用RegEx。考虑到应用程序,我通过ForEach循环运行Get-Content,并逐行替换文本。

Get-Content C:\Path\To\File.txt | ForEach{$_ -replace "(PKG_DOMAINJOIN_PASSWD;`")([^`"]+?)(`")", "`${1}12345678`$3"}

那会输出:

Property;Value
PKG_GUID;"939de9ec-c9ac-4e03-8bef-7b7ab99bff74"
PKG_NAME;"WinBasics"
PKG_RELATED_TICKET;""
PKG_CUSTOMER_DNS_SERVERS;"12314.1231
PKG_CUSTOMER_SEARCH_DOMAINS;"ms.com"
PKG_JOIN_EXISTING_DOMAIN;"True"
PKG_DOMAINJOIN_DOMAIN;"ms.com"
PKG_DOMAINJOIN_USER;"mdoe"
PKG_DOMAINJOIN_PASSWD;"12345678"

第二个想法,我不知道我是否这样做。我可以将其导入为CSV,更新属性,然后再次导出CSV。

Import-CSV C:\Path\To\File.txt -Delimiter ";" |%{if($_.Property -eq "PKG_DOMAINJOIN_PASSWD"){$_.value = "12345678";$_}else{$_}|export-csv c:\path\to\newfile.txt -delimiter ";" -notype