免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
12下一页
最近访问板块 发新帖
查看: 3572 | 回复: 11

[学习共享] 魔教妖人30行powershell代码,尽解“掐头,去尾,取中间”问题 [复制链接]

论坛徽章:
0
发表于 2018-02-06 15:41 |显示全部楼层

本人 原创文章。始于 2018-02-04 允许转载,但必须保留名字和出处,否则追究法律责任



        歌曲有云,“你总是匹配头,匹配尾,独自一人匹配到天亮。。。”


==============================【第一章 前言】==============================

    掐头,去尾,过滤(保留)中间的问题,是我们写脚本最常遇到的。

http://bbs.chinaunix.net/thread-4262197-1-1.html
http://bbs.chinaunix.net/thread-4263954-1-1.html   尽解 掐头 去尾 的ps函数。
http://bbs.chinaunix.net/thread-4264638-1-1.html
http://bbs.chinaunix.net/thread-4291758-1-1.html
http://bbs.chinaunix.net/thread-4291881-1-1.html
http://bbs.chinaunix.net/thread-4251010-1-1.html

==============================【第二章 代码】==============================

我写过一段ps代码,主要代码不到30行。注释不算行数,echo类语句不算行数。花括号不算行数。

只需要简单修改,任意(保留),(除掉),【头】【尾】【中间】。可以尽解所有【掐头】【去尾】【取中间】的问题。
真正做到了代码复用,无需学习正则。代码如下:


  1. $文件存入大字符串 = Get-Content -LiteralPath 'a:\pscode\0\掐头去尾取中间\20170726.txt' -raw
  2. #$文件存入大字符串 = Get-Content -raw -LiteralPath $args[0]
  3. $已经找到了匹配头 = $false
  4. $从偏移量开始 = 0
  5. $匹配头字符串 = "Channel:北京卫视`r`n"
  6. $匹配尾字符串 = 'Channel:'
  7. #$匹配身字符串 = 'ccc'

  8. do
  9. {
  10.     if ($已经找到了匹配头 -eq $false)
  11.     {
  12.         $tmp匹配头位置 = $文件存入大字符串.IndexOf($匹配头字符串,$从偏移量开始)
  13.         if ($tmp匹配头位置 -eq -1)
  14.         {
  15.             Write-Host '找不到头了'
  16.             exit 1
  17.         }
  18.         else
  19.         {
  20.             $匹配头位置 = $tmp匹配头位置
  21.             $已经找到了匹配头 = $true
  22.             $从偏移量开始 = $匹配头位置 + 1
  23.         }
  24.     }
  25.     else
  26.     {
  27.         $tmp匹配尾位置 = $文件存入大字符串.IndexOf($匹配尾字符串,$从偏移量开始)
  28.         if ($tmp匹配尾位置 -eq -1)
  29.         {
  30.             Write-Host '找不到尾了'
  31.             exit 2
  32.         }
  33.         else
  34.         {
  35.             $匹配尾位置 = $tmp匹配尾位置
  36.             [string]$匹配出的字符串 = $文件存入大字符串.Substring($匹配头位置,($匹配尾位置 - $匹配头位置))
  37.             #            if (  $匹配出的字符串.Contains($匹配身字符串)  ) #区分大小写
  38.             #            {
  39.             Write-Host $匹配出的字符串
  40.             #            }
  41.             $已经找到了匹配头 = $false
  42.             $从偏移量开始 = $匹配尾位置 + 1
  43.         }
  44.     }
  45. }
  46. while ($从偏移量开始 -lt $文件存入大字符串.Length)
  47. 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 ... 086&__o=/search||songListIcon&fr=ps||www.baidu.com&__s=心太软 伴奏#

---------------------

你总是【匹配头】,【匹配尾】,
独自一个人,匹配到天亮,
你无怨无悔,的用正则匹配,
我知道你,根本已经烦躁。

---------------------

你总是【造新轮】,【造新瓶】,
把所有脚本都自己扛  昂~~~
正则总是简单,学好太难,
不懂【贪婪】,就别再勉强 扬~~~

---------------------

夜深了你还不想睡
你还在想着他吗
你这样痴情到底累不累
明知他不会回来安慰

只不过,想好好,写一个过滤,
可惜它,无法给你满分(正则)
多余的牺牲,他不懂心疼
你应该不会只想,做个好人

喔 几天没写,就已经忘了吧(正则)
该放就放,再想也没有用,
傻傻等待,也不会记起来,
你总该为自己,想想未来

---------------------

你总是【匹配头】,【匹配尾】,
独自一个人,匹配到天亮,
你要是会了,我30行代码,
它能让你,从根本变的更强。

---------------------

你总是【造新轮】,【造新瓶】,
把所有脚本都自己扛  昂~~~
【旧轮】总是简单,【新轮】太难,
30行代码,学会了,就会变强 ~~~
30行代码,你学了,就变得更强 ~~~




“你总是匹配头,匹配尾,独自一人匹配到天亮。。。”

以后遇到类似问题,想想这首歌词即可。

---------完------------



论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-02-06 15:56 |显示全部楼层
好害怕....追究法律责任

半年过去了......没看什么人学会了...

http://bbs.chinaunix.net/thread-4263951-1-1.html

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
发表于 2018-02-09 19:07 |显示全部楼层
回复 2# jason680

半年过去了......没看什么人学会了...
大师兄sunzhiguoluv学不会, 退隐江湖.
二师兄dorodaloo也学不会, 愤而投入其他门派

没人学会

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
发表于 2018-02-09 19:20 |显示全部楼层
只能鼓励一些没头没脑的小白, 投入ps的学习,
由内部瓦解 魔教

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2018-02-10 09:42 |显示全部楼层
对壳语言这样的坑还是很有兴趣的,待时机一至,自主填之

也配个歌词:

  就向前闯
  用力飞翔
  飞过每个熟悉地方
  灰色土壤
  你的泪光
  残缺不堪的城墙
  倔强脸庞
  褪去迷惘
  信念象繁花一样在远处绽放
  时间的形状
  象天空刺眼逆光

论坛徽章:
21
申猴
日期:2014-10-10 15:56:39射手座
日期:2014-10-10 15:57:18黑曼巴
日期:2018-05-14 11:05:122016科比退役纪念章
日期:2018-05-14 11:05:0715-16赛季CBA联赛之北控
日期:2018-05-14 11:05:0015-16赛季CBA联赛之江苏
日期:2017-02-27 18:11:0715-16赛季CBA联赛之上海
日期:2018-08-15 09:48:5415-16赛季CBA联赛之佛山
日期:2018-07-20 17:14:23
发表于 2018-02-12 15:38 |显示全部楼层
本帖最后由 chengchow 于 2018-02-12 15:40 编辑


别理楼上的
不明觉厉,代码就要写的让人看不懂,这样才能现的我们很厉害!

顺便问下PS是什么,photoshop吗?

论坛徽章:
6
数据库技术版块每日发帖之星
日期:2015-11-27 06:20:00程序设计版块每日发帖之星
日期:2015-12-01 06:20:00每日论坛发贴之星
日期:2015-12-01 06:20:0015-16赛季CBA联赛之佛山
日期:2017-03-26 23:38:0315-16赛季CBA联赛之江苏
日期:2017-07-17 10:08:4415-16赛季CBA联赛之北京
日期:2018-03-04 17:01:50
发表于 2018-02-12 19:11 |显示全部楼层
回复 6# chengchow

问下PS是什么
Please don't Stop  

论坛徽章:
130
技术图书徽章
日期:2013-10-01 15:32:13戌狗
日期:2013-10-25 13:31:35金牛座
日期:2013-11-04 16:22:07子鼠
日期:2013-11-18 18:48:57白羊座
日期:2013-11-29 10:09:11狮子座
日期:2013-12-12 09:57:42白羊座
日期:2013-12-24 16:24:46辰龙
日期:2014-01-08 15:26:12技术图书徽章
日期:2014-01-17 13:24:40巳蛇
日期:2014-02-18 14:32:59未羊
日期:2014-02-20 14:12:13白羊座
日期:2014-02-26 12:06:59
发表于 2018-02-13 10:57 |显示全部楼层
PowerShell打不开,打开就说已停止工作。

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2018-02-14 10:11 |显示全部楼层
为什么打不开,为什么停止工作,因为它不由自主

                        -论壳语言的自我修养

论坛徽章:
6
2015年辞旧岁徽章
日期:2015-03-05 16:13:092015年迎新春徽章
日期:2015-03-05 16:13:092015小元宵徽章
日期:2015-03-06 15:58:1815-16赛季CBA联赛之浙江
日期:2016-11-05 14:38:4115-16赛季CBA联赛之新疆
日期:2016-11-11 18:38:06
发表于 2018-02-15 08:14 |显示全部楼层
壳语言的自主过程,就是自身发展强大的过程。

问题在发展的过程中解决,所以遇到问题,自主是根本解决之道
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122
中国互联网协会会员  联系我们:wangnan@it168.com
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP