- 論壇徽章:
- 0
|
本帖最后由 本友會機友會攝友會 于 2019-05-20 11:03 編輯
本人 原創文章。始于 2018-02-04 允許轉載,但必須保留名字和出處,否則追究法律責任
ps找算替.ps1,即powershell版的sed。
是我根據這個找替原理,編寫的查找替換實用工具軟件。
腳本下載地址:
https://pan.baidu.com/s/1yuqUOhY9lEw65vJ-vceg4w
里面有《ps找算替_v3_readme.txt》
歌曲有云,“你總是匹配頭,匹配尾,獨自一人匹配到天亮。。!
==============================【第一章 前言】==============================
掐頭,去尾,過濾(保留)中間的問題,是我們寫腳本最常遇到的。
http://www.cesargiobbi.com/thread-4262197-1-1.html
http://www.cesargiobbi.com/thread-4263954-1-1.html 盡解 掐頭 去尾 的ps函數。
http://www.cesargiobbi.com/thread-4264638-1-1.html
http://www.cesargiobbi.com/thread-4291758-1-1.html
http://www.cesargiobbi.com/thread-4291881-1-1.html
http://www.cesargiobbi.com/thread-4251010-1-1.html
==============================【第二章 代碼】==============================
我寫過一段ps代碼,主要代碼不到30行。注釋不算行數,echo類語句不算行數;ɡㄌ柌凰阈袛。
只需要簡單修改,任意(保留),(除掉),【頭】【尾】【中間】?梢员M解所有【掐頭】【去尾】【取中間】的問題。
真正做到了代碼復用,無需學習正則。代碼如下:
- $文件存入大字符串 = Get-Content -LiteralPath 'a:\pscode\0\掐頭去尾取中間\20170726.txt' -raw
- #$文件存入大字符串 = Get-Content -raw -LiteralPath $args[0]
- $已經找到了匹配頭 = $false
- $從偏移量開始 = 0
- $匹配頭字符串 = "Channel:北京衛視`r`n"
- $匹配尾字符串 = 'Channel:'
- #$匹配身字符串 = 'ccc'
- do
- {
- if ($已經找到了匹配頭 -eq $false)
- {
- $tmp匹配頭位置 = $文件存入大字符串.IndexOf($匹配頭字符串,$從偏移量開始)
- if ($tmp匹配頭位置 -eq -1)
- {
- Write-Host '找不到頭了'
- exit 1
- }
- else
- {
- $匹配頭位置 = $tmp匹配頭位置
- $已經找到了匹配頭 = $true
- $從偏移量開始 = $匹配頭位置 + 1
- }
- }
- else
- {
- $tmp匹配尾位置 = $文件存入大字符串.IndexOf($匹配尾字符串,$從偏移量開始)
- if ($tmp匹配尾位置 -eq -1)
- {
- Write-Host '找不到尾了'
- exit 2
- }
- else
- {
- $匹配尾位置 = $tmp匹配尾位置
- [string]$匹配出的字符串 = $文件存入大字符串.Substring($匹配頭位置,($匹配尾位置 - $匹配頭位置))
- # if ( $匹配出的字符串.Contains($匹配身字符串) ) #區分大小寫
- # {
- Write-Host $匹配出的字符串
- # }
- $已經找到了匹配頭 = $false
- $從偏移量開始 = $匹配尾位置 + 1
- }
- }
- }
- while ($從偏移量開始 -lt $文件存入大字符串.Length)
- Write-Host '正常結束'
復制代碼
==============================【第三章 講解重要!】==============================
下面我來講解下我的代碼:
整個代碼塊很簡單:
do
{
if ($已經找到了匹配頭 -eq $false) {找頭代碼}
else {找尾代碼}
}
while (從0到文件尾)
1do-while循環,遍歷整個字符串,文件。
2找完頭,就找尾。如果不需要找尾,就只用找頭代碼。即找頭,找頭,找頭。 ;)
3在【頭尾匹配】情況中,頭尾都找到了,就可以,任意(保留),(除掉),【頭】【尾】【中間】。
4在【頭頭匹配】情況中,兩個頭都找到了,也可以,任意(保留),(除掉),【頭】【尾】【中間】。
5可以通過簡單修改,如在循環,遞歸中,添加計數等。
6取到的部分,可以通過循環,遞歸,再取。
7匹配尾,是匹配頭后面第一個。如果想要最后一個,應該用lastindexof替換indexof,即【$tmp匹配尾位置 = $文件存入大字符串.LastIndexOf($匹配尾字符串,$從偏移量開始)】
8代碼雖然不是特別簡短,但30行,代碼清晰,豬能懂,傻能改!一勞永逸。萬用。盡解頭尾中間問題。
9作為對比:
9.1 awk,sed正則難。
9.2 每一個類似的問題,awk,sed都總要重寫代碼。代碼無法復用。雖然這代碼比30行短。
9.3 代碼無法復用。意味著,自己寫過的代碼,留著也無用,對吧。
9.4 代碼差別太大。意味著,半年后溫習自己寫過的代碼,陌生了,重新理解,對吧。
10代碼的原理,和正則類似,相當于打散的正則,更方便控制。
11此代碼的性能:
一次讀取所有字符串。不適合于太大的文本。對于大文本,只需要簡單修改腳本代碼。
11.1大文件,請修改代碼第一行。使用.net文件流StreamReader,一行行讀取文本,來達到最佳性能。
11.2匹配過程中產生的,臨時字符串。使用.net的內存字符串stringbuilder,來達到最佳性能。
==============================【第四章 結論】==============================
如果說,重新造輪,是造新【酒瓶】的話。
shell+awk+sed:
我總是造新瓶,每個瓶子絕不重樣。然后用新酒瓶裝酒。
powershell:
收酒瓶子嘞,我總是:
1克隆舊瓶,成為新瓶。
2給新瓶傳入參數。簡單調整新瓶長、寬、高、形狀、顏色、等參數。
3然后裝新酒。
當然還是用舊瓶克隆簡單,對吧。
什么?
舊瓶不如新瓶好?不如新瓶干凈?啤酒廠都是刷洗舊瓶的,別告訴我你沒喝過【600ml綠玻璃瓶啤酒】。
即便新瓶,也還是用的舊玻璃。正則還不是10年前的舊的?
==============================【第五章 歌曲】==============================
最后,獻給大家一周歌: 《你總是匹配頭》
《你總是心太軟》在線伴奏:
http://play.baidu.com/?__m=mboxC ... =704086&__o=/search||songListIcon&fr=ps||www.baidu.com&__s=心太軟 伴奏#
---------------------
你總是【匹配頭】,【匹配尾】,
獨自一個人,匹配到天亮,
你無怨無悔,的用正則匹配,
我知道你,根本已經煩躁。
---------------------
你總是【造新輪】,【造新瓶】,
把所有腳本都自己扛 昂~~~
正則總是簡單,學好太難,
不懂【貪婪】,就別再勉強 揚~~~
---------------------
夜深了你還不想睡
你還在想著他嗎
你這樣癡情到底累不累
明知他不會回來安慰
只不過,想好好,寫一個過濾,
可惜它,無法給你滿分(正則)
多余的犧牲,他不懂心疼
你應該不會只想,做個好人
喔 幾天沒寫,就已經忘了吧(正則)
該放就放,再想也沒有用,
傻傻等待,也不會記起來,
你總該為自己,想想未來
---------------------
你總是【匹配頭】,【匹配尾】,
獨自一個人,匹配到天亮,
你要是會了,我30行代碼,
它能讓你,從根本變的更強。
---------------------
你總是【造新輪】,【造新瓶】,
把所有腳本都自己扛 昂~~~
【舊輪】總是簡單,【新輪】太難,
30行代碼,學會了,就會變強 ~~~
30行代碼,你學了,就變得更強 ~~~
“你總是匹配頭,匹配尾,獨自一人匹配到天亮。。!
以后遇到類似問題,想想這首歌詞即可。
---------完------------
|
|