iT邦幫忙

0

PowerShell 字串取代問題

不好意思打擾各位先進,因小弟最近在編寫用PowerShell做檔案處理的程序中出現了問題,查詢網路資訊許久也沒查詢到理想的範例。

想請問各位先進,下方為小弟處理過並讀出的字串其中一段的內容,長度為256,無斷行,紅底值為固定值,除外隨機:

002550001201907172126319700014843901907171109 100 00000530000000000000000000000000000005300000003900000000000005300000000000000000000005300000000000000000000000000800 001 100000 100163870876
002551907171484390010 02311

目標:
想將上方字串中紅底的值單獨修改成99,其他的值則維持原樣並輸出。

以下為小弟的程式碼,但結果會變成字串中只要達成條件的值都會被替換掉。

$Get256.replace($Get256.substring(9,2),'99')

請教各位先進該怎麼做才好呢?煩請指點小弟一下方向,感謝各位先進。

看更多先前的討論...收起先前的討論...
ccutmis iT邦高手 8 級 ‧ 2019-08-28 14:08:36 檢舉
$Get256.replace('002550001201907172126319700014843901907171109','002550001991907172126319700014843901907171109')
narumi iT邦新手 5 級 ‧ 2019-08-28 14:12:57 檢舉
@ccutmis
感謝先進的回覆,但其實用這種方式取代並非小弟想達成的目標。
感該說,這只是處理後的其中一行字串值,而只有紅底的部分值是固定值。
所以,用整行參照取代是不可行的,不好意思小弟說明的不太清楚,已在內文中補上。
問題看起來會認為將字串的第10,11個字元替換成"99" ?
所以條件到底是什麼?
narumi iT邦新手 5 級 ‧ 2019-08-28 14:20:26 檢舉
@michaelwan
感謝先進的回覆,條件就如先進所說的一樣,字串的第10,11的字串取出,並取代成"99",但其他的值不取代,字串中與條件相同的值不取代。
最後結果希望只有被指定的區域的值被取代後輸出,並非單被取代的值被輸出而是整行字串。
ccutmis iT邦高手 8 級 ‧ 2019-08-28 14:29:24 檢舉
你原先寫法有問題在於取出來的值是'20'所以只要全文裡面是'20'的都會被'99'取代。我先前的解法是因為你給的資訊沒說第一行內容是否會變動,
若是會變動而只要改動第10~11這兩個字元的數字,可以參考以下的寫法:
$foo = '00255000120190717212.........略.....ABCDEFG'
$foo=$foo -replace "(^\d{9})(\d{2})(.*?)$",'$199$3'

更多資訊可以google搜
"powershell regular expression replace example stackoverflow"
zero iT邦新手 1 級 ‧ 2019-08-28 14:32:06 檢舉
你的程式碼看起來有達成你的要求,我剛剛實際運作過沒問題,所以你的$Get256 Data Type是不是有問題? 所以你才搞不定?
froce iT邦大師 1 級 ‧ 2019-08-28 14:33:28 檢舉
何必堅持用replace?

$a = "002550001201907172126319700014843901907171109"
$replaceStr = "20"
$b = $a.Remove($a.IndexOf($replaceStr), $replaceStr.Length).Insert($a.IndexOf($replaceStr), "99")
echo $b

如果需要呼叫很多次,自己去把他弄成function吧...
ccutmis iT邦高手 8 級 ‧ 2019-08-28 14:34:50 檢舉
因為感覺比較酷...
narumi iT邦新手 5 級 ‧ 2019-08-28 14:51:36 檢舉
@froce
感謝froce先進,目標字串被取代並成功輸出了。
不是堅持一定要用replace,而是用關鍵字[字串 取代]下去查詢的結果大多都是用replace在寫,所以小弟。。。

感謝froce先進幫小弟上了一課,果然寫程式不能讓自己的腦袋太死,要會懂的改變。
froce iT邦大師 1 級 ‧ 2019-08-28 14:58:22 檢舉
不是要懂得改變,是要懂得會用英文google...我用英文去查不到5分鐘。XD
用replace的話都是正規化的解法,就像ccutimis提供的一樣。
narumi iT邦新手 5 級 ‧ 2019-08-28 15:06:41 檢舉
@froce
不好意思,小弟用您提供的方式跑了一下自檢,發現到若開頭值為20的話,一樣會被取代成99,看來還是有點問題。
是不是還是要用正規化replace會比較好呢?
好吧...慢了好幾步..那就提供一個$Matches[1]+"99"+$Matches[3]
$Matches[0]是全部字串, 其他就regulare group
ccutmis iT邦高手 8 級 ‧ 2019-08-28 15:45:10 檢舉
試試這個
$foo = '00255000120190717212.........略.....ABCDEFG'
$foo=$foo -replace "(^\d{9})(\d{2})(.*?)$",'$1ACE$3'
$foo.replace('ACE','99')
先前寫的沒有測過(有點小問題:$1 變成$199 要繞路避這問題)
這次的範例有開powershell來測了 給樓主參考...
froce iT邦大師 1 級 ‧ 2019-08-28 15:57:32 檢舉
要固定位置的話,下面的回答就不錯了啊。
我的是本來就只找第一個遇到的相符字串位置。
ccutmis iT邦高手 8 級 ‧ 2019-08-28 16:03:00 檢舉
樓下的解法可以...
narumi iT邦新手 5 級 ‧ 2019-08-28 16:29:27 檢舉
各位先進,不好意思,樓下先進的解法,若是開頭或其中的值達成替換條件的話,也會跟著被替換掉。。。

有沒有跟直接的方法,我就是固定要替換這個位置的值,其它無視呢?
narumi iT邦新手 5 級 ‧ 2019-08-28 16:34:25 檢舉
我想我的想法一開始就出錯了,文中的值是經過處理得到的結果,那就代表這個值其實就是初步我想要的值,然後就很簡單直接把固定位置的值替換掉就好了!

想這麼多跟本自己撞壁。。。

感謝各位先進的幫忙!

2 個回答

2
jeles51
iT邦研究生 4 級 ‧ 2019-08-28 14:31:06

如果說固定位置的字元要取代,
小弟有比較笨的作法,請參考:

# 範例是把固定第4/5/6字元換成 New
# 原理 把字串切成2段, 先把前半替代完成 = t2
# 結果就是 t2 + t3 (前半+後半)
$tt='1234567890123456789'
$t1=$tt.substring(0,5)
$t2=$t1.Replace($t1.substring(2,3),"New")
$t3=$tt.Remove(0,5)
$t2+$t3
2
dragonH
iT邦超人 6 級 ‧ 2019-08-28 16:18:09

固定位置的話

$old = "000000000XX0000000000"
$new = $old.remove(9, 2).insert(9,"99")
echo $old
echo $new

參考

narumi iT邦新手 5 級 ‧ 2019-08-28 16:31:26 檢舉

感謝先進的幫忙!

我要發表回答

立即登入回答