设为首页 加入收藏

TOP

Linux Shell脚本中如何自由操作字符串(一)
2014-11-24 07:48:43 来源: 作者: 【 】 浏览:2
Tags:Linux Shell 脚本 如何 自由 操作 字符串

Bash所支持的字符串操作的数量多的令人惊讶. 但是不幸的是, 这些工具缺乏统一的标准. 一些是参数替换的子集, 而另外一些则受到UNIX expr命令的影响. 这就导致了命令语法的不一致, 还会引起冗余的功能, 但是这些并没有引起混乱.


字符串长度


${#string}


expr length $string


expr "$string" : '.*'


1 stringZ=abcABC123ABCabc
2
3 echo ${#stringZ} # 15
4 echo `expr length $stringZ` # 15
5 echo `expr "$stringZ" : '.*'` # 15



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


例子 9-10. 在一个文本文件的段落之间插入空行


1 #!/bin/bash
2 # paragraph-space.sh
3
4 # 在一个单倍行距的文本文件中插入空行.
5 # Usage: $0 6
7 MINLEN=45 # 可能需要修改这个值.
8 # 假定行的长度小于$MINLEN所指定的长度的时候
9 #+ 才认为此段结束.
10
11 while read line # 提供和输入文件一样多的行...
12 do
13 echo "$line" # 输入所读入的行本身.
14
15 len=${#line}
16 if [ "$len" -lt "$MINLEN" ]
17 then echo # 在短行(译者注: 也就是小于$MINLEN个字符的行)后面添加一个空行.
18 fi
19 done
20
21 exit 0


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



匹配字符串开头的子串长度


expr match "$string" '$substring'
$substring是一个正则表达式.


expr "$string" : '$substring'
$substring是一个正则表达式.



1 stringZ=abcABC123ABCabc
2 # |------|
3
4 echo `expr match "$stringZ" 'abc[A-Z]*.2'` # 8
5 echo `expr "$stringZ" : 'abc[A-Z]*.2'` # 8



索引


expr index $string $substring
在字符串$string中所匹配到的$substring第一次所出现的位置.



1 stringZ=abcABC123ABCabc
2 echo `expr index "$stringZ" C12` # 6
3 # C 字符的位置.
4
5 echo `expr index "$stringZ" 1c` # 3
6 # 'c' (in #3 position) matches before '1'.



这与C语言中的strchr()函数非常相似.



提取子串


${string:position}
在$string中从位置$position开始提取子串.


如果$string是"*"或者"@", 那么将会提取从位置$position开始的位置参数. [1]


${string:position:length}
在$string中从位置$position开始提取$length长度的子串.



1 stringZ=abcABC123ABCabc
2 # 0123456789.....
3 # 0-based indexing.
4
5 echo ${stringZ:0} # abcABC123ABCabc
6 echo ${stringZ:1} # bcABC123ABCabc
7 echo ${stringZ:7} # 23ABCabc
8
9 echo ${stringZ:7:3} # 23A
10 # 提取子串长度为3.
11
12
13
14 # 能不能从字符串的右边(也就是结尾)部分开始提取子串
15
16 echo ${stringZ:-4} # abcABC123ABCabc
17 # 默认是提取整个字符串, 就象${parameter:-default}一样.
18 # 然而 . . .
19
20 echo ${stringZ:(-4)} # Cabc
21 echo ${stringZ: -4} # Cabc
22 # 这样, 它就可以工作了.
23 # 使用圆括号或者添加一个空格可以"转义"这个位置参数.
24
25 # 感谢, Dan Jacobson, 指出这点.



如果$string参数是"*"或"@", 那么将会从$position位置开始提取$length个位置参数, 但是由于可能没有$length个位置参数了, 那么就有几个位置参数就提取几个位置参数.



1 echo ${*:2} # 打印出第2个和后边所有的位置参数.
2 echo ${@:2} # 同上.
3
4 echo ${*:2:3} # 从第2个开始, 连续打印3个位置参数.



expr substr $string $position $length
在$string中从$position开始提取$length长度的子串.



1 stringZ=abcABC123ABCabc
2 # 123456789......
3 # 以1开始计算.
4
5 echo `expr substr $stringZ 1 2` # ab
6 echo `expr substr $stringZ 4 3` # ABC



expr match "$string" '\($substring\)'
从$string的开始位置提取$substring, $substring是正则表达式.


expr "$string" : '\($substring\)'
从$string的开始位置提取$substring, $substring是正则表达式.



1 stringZ=abcABC123ABCabc
2 # =======
3
4 echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1
5 echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'` # abcABC1
6 echo `expr "$stringZ" : '\(.......\)'` #

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Android NDK的C/C++代码中利用JNI.. 下一篇Linux中C程序因栈空间不足而出现..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·JAVA现在的就业环境 (2025-12-26 01:19:24)
·最好的java反编译工 (2025-12-26 01:19:21)
·预测一下2025年Java (2025-12-26 01:19:19)
·Libevent C++ 高并发 (2025-12-26 00:49:30)
·C++ dll 设计接口时 (2025-12-26 00:49:28)