[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[转载代码] 用PowerShell对字符串处理

本篇文章引用的小例子来自如下链接:
http://bbs.chinaunix.net/thread-201843-1-1.html

这是一篇很不错的精华文章, 主要讨论了使用expr命令和Bash扩展的一些字符串操作.
这里我将会大量使用.Net Framework 2.0 类库 System 名字空间中 String 类的各种方法.

1. 我们来看Shell中求字符串长度的例子:

%x="abcd"
#方法一
%expr length $x
4
# 方法二
%echo ${#x}
4
# 方法三
%expr "$x" : ".*"
4


我们需要这么多种办法嘛??我觉得一种就够了. PowerShell中, 调用字符串长度的属性就可以返回字符串长度了, 如下:

PS C:\> "abcd"
abcd
PS C:\> "abcd".length
4


PowerShell看起来是不是更加的清楚呢?

2. 我们接下来看看shell中 查找子串:

%expr index $x "a"
1
%expr index $x "bc"
2
%expr index $x "cd"
3


expr返回的数组下标是从1开始计数的. 看看PowerShell怎么应付呢?

PS C:\> $x="abcd"
PS C:\> $x.IndexOf('a')
0
PS C:\> $x.IndexOf('b')
1
PS C:\> $x.IndexOf('bc')
1
PS C:\> $x.IndexOf('cd')
2
PS C:\> $x.IndexOf('ef')
-1


OK, PowerShell的数组下标和大部分编程语言一致, 数组下标是从0开始计算的.

3. 在Shell中得到子字符串:

# 方法一
# expr <string> startpos length
%expr substr "$x" 1 3
abc
%expr substr "$x" 1 5
abcd
%expr substr "$x" 2 5
bcd
# 方法二
# ${x:pos:lenght}
%echo ${x:1}
bcd
%echo ${x:2}
cd
%echo ${x:0}
abcd
%echo ${x:0:2}
ab
%pos=1
%len=2
%echo ${x:$pos:$len}
bc


来看看PowerShell的Substring方法吧

PS C:\> $x
abcd
PS C:\> $x.Substring(0, 2)
ab
PS C:\> $x.Substring(0, 4)
abcd
PS C:\> $x.Substring(0, 6)
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within the string.
Parameter name: length"
At line:1 char:13

+ $x.Substring( <<<< 0, 6)
PS C:\> trap { $x.Substring(0, 6) }
PS C:\>


PowerShell不允许在对字符串操作过程中, 出现越界的情况. 因此其中一个例子给出了错误信息. 但是接下来我使用trap关键字, 将执行的异常捕获. 因此, 这次操作就什么都没有输出.

4. shell中匹配正则表达式:

# 打印匹配长度
%expr match $x "."
1
%expr match $x "abc"
3
%expr match $x "bc"
0


这里可以看到, expr支持正则表达式, 匹配后给出了匹配的长度. 我们看看PowerShell内置的正则表达式运算符:

PS C:\> $x -match '.'; $matches[0]; ($matches[0]).length
True
a
1
PS C:\> $x -match 'abc'; $matches[0]; ($matches[0]).length
True
abc
3
PS C:\> $x -match 'dc'; $matches[0]; ($matches[0]).length
False
abc
3


这里三个语句都发出了自己的执行结果, -match操作符返回bool值, 提示是否匹配成功. 如果匹配成功可以通过访问$matches这个hashtable获得返回情况. 默认整个正则表达式匹配的信息被放在key = 0的位置. 如果匹配不成功, $matches的信息是不会被更新的. 这些行为和Perl几乎一样. 熟悉Perl的朋友是不是觉得这个地方很自然??相比使用expr, 虽然这里复杂了一些, 但是功能确强大了很多.

5. 在Shell中对字符串的掐头去尾

%x=aabbaarealwwvvww
%echo "${x%w*w}"
aabbaarealwwvv
%echo "${x%%w*w}"
aabbaareal
%echo "${x##a*a}"
lwwvvww
%echo "${x#a*a}"
bbaarealwwvvww


哎呀, 这个奇怪的表达式, 看起来让人费解呢...>_<看看-replace运算符是如何工作的吧^^

PS C:\> $x = 'aabbaarealwwvvww'
PS C:\> $x -replace 'w*$'
aabbaarealwwvv
PS C:\> $x -replace 'w.*w$'
aabbaareal
PS C:\> $x -replace '^a.*a'
lwwvvww
PS C:\> $x -replace '^a*'
bbaarealwwvvww
PS C:\>


你会用正则表达式嘛??如果你会, 那么上面的操作, 用正则表达式表示不是很简单嘛?

6. 在Shell中字符串的替换

这里不允许使用regex呢..不过可以用*,?...

%x=abcdabcd
%echo ${x/a/b} # 只替换一个
bbcdabcd
%echo ${x//a/b} # 替换所有
bbcdbbcd


第一个例子用PowerShell好像不容易呢...因为-replace是整行匹配的. 这点上不如Perl的s:::功能强大. 我先给出第二个的办法...^^也许以后会想到好办法呢

PS C:\> $x='abcdabcd'
PS C:\> $x -replace 'a','b'
bbcdbbcd


写到这里, 我想大家也能感受到PowerShell的一些特性, 正如我的理解, 所有.Net程序员, 天生对PowerShell中大部分功能是非常熟悉的. 可以直接调用.Net上的方法, 为PowerShell扩展了强大的功能.

我再给几个比较有意思的功能:

PS C:\> $x
abcdabcd
PS C:\> $x.ToUpper()
ABCDABCD
PS C:\> $x.ToUpper().ToLower()
abcdabcd
PS C:\> $x='abcdabcdab'
PS C:\> $x.Trim('ab')
cdabcd


Trim是个常见的功能, 还有TrimStart, TrimEnd. ToUpper, ToLower更是很方便的功能.

http://blog.chinaunix.net/uid-9781829-id-1997702.html

1 在。net和powershell中,字符串 是对象,其抽象类为system.string类。
这个类中的所有属性和方法在 微软.net的的帮助网站上都能找到,是本地语言的.
http://msdn.microsoft.com/zh-cn/library/system.string.aspx
脚本是写给人看的,是写给用户看的,而不是写给机子看的
用户能看懂、会修改的脚本,才是好脚本。
写易懂的powershell脚本帮人解决问题,进而让用户学会自渔,吾所愿也

TOP

返回列表