Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串 _JAVA_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > JAVA > Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串

Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串

 2011/11/5 10:02:55  codingstandards  http://codingstandards.iteye.com  我要评论(0)
  • 摘要:Bash字符串处理(与Java对照)-26.根据位置和长度截取子串InJavaString.substringStringsubstring(intbeginIndex)返回一个新的字符串,它是此字符串的一个子字符串。Stringsubstring(intbeginIndex,intendIndex)返回一个新字符串,它是此字符串的一个子字符串。InBashBash内置的取子串功能取指定位置开始到串尾的子串,INDEX从0开始算。${STR:$INDEX}取指定位置开始、指定长度的子串$
  • 标签:

Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串

In Java

String.substring

String ??? substring(int beginIndex)
????????? 返回一个新的字符串,它是此字符串的一个子字符串。
?String ??? substring(int beginIndex, int endIndex)
????????? 返回一个新字符串,它是此字符串的一个子字符串。

?

In Bash

Bash内置的取子串功能

取指定位置开始到串尾的子串,INDEX从0开始算。

${STR:$INDEX}

取指定位置开始、指定长度的子串

${STR:$INDEX:$LENGTH}

与Java不同的是,LENGTH可以大于串的长度。

?

[root@jfht ~]# STR=Hello
[root@jfht ~]# echo ${STR:3}
lo
[root@jfht ~]# echo ${STR:1:2}
el

[root@jfht ~]# echo ${STR:2:10}
llo

?

另外, INDEX还可以是负数,意思是从尾部倒数的位置开始。

但是要注意INDEX的写法,加上小括号,或者在前面加空格或0。

[root@jfht ~]# STR=Hello
[root@jfht ~]# echo ${STR:(-2)}
lo
[root@jfht ~]# echo ${STR:(-3)}
llo
[root@jfht ~]# echo ${STR:-3}?
Hello

-3没有加小括号或前面加空格,就会产生问题。

[root@jfht ~]# echo ${STR: -3}??
llo
[root@jfht ~]# echo ${STR:(-3):2}
ll

[root@jfht ~]# STR=123456789

有文章说也可以在前面加0,试了一下果然可以。
[root@jfht ~]# echo ${STR:0-4}
6789
[root@jfht ~]# echo ${STR:0-4:3}
678

?

补充对${STR:-3}的说明。

man bash 写道 ${parameter:-word}
??? Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise,
the value of parameter is substituted.

?

使用expr substr取子串

另外也有用expr来取子串的,但效率不如上面。

expr substr "$STR" "$POS" "$LENGTH"

注意:POS从1开始。

man expr 写道 substr STRING POS LENGTH
??? substring of STRING, POS counted from 1 ?

[root@jfht ~]# STR=Hello

[root@jfht ~]# expr substr "$STR" 2
expr: 语法错误
[root@jfht ~]# expr substr "$STR" 2 1
e
[root@jfht ~]# expr substr "$STR" 2 3
ell
[root@jfht ~]# expr substr "$STR" 2 10
ello

?

使用expr正则表达式匹配功能也可以实现取子串,不过有点杀鸡用牛刀了。

[root@jfht ~]# STR=123456789
[root@jfht ~]# POS=3
[root@jfht ~]# LEN=4
[root@jfht ~]# expr match "$STR" ".\{$POS\}\(.\{$LEN\}\).*"
4567

?

用cut命令截取子串

用cut命令也可以进行字符串截取。

echo "$STR" | cut -c$START-$END

截取STR串中从START开始到END结束的子串,位置从1开始计数。

echo "$STR" | cut -c$START-

截取STR串中从START开始到末尾的子串。

echo "$STR" | cut -c-$END

截取STR串中从头开始到END的子串。

?

[root@jfht ~]# STR=123456789
[root@jfht ~]# echo "$STR" | cut -c3-4
34
[root@jfht ~]# START=3
[root@jfht ~]# END=4
[root@jfht ~]# echo "$STR" | cut -c$START-$END
34

[root@jfht ~]# echo "$STR" | cut -c$START-
3456789

[root@jfht ~]# echo "$STR" | cut -c-$END
1234

?

用awk substr截取子串

用awk命令来进行字符串截取,网上很多例子有错。

echo "$STR" | awk '{print substr($0,'$POS','$LEN')}'

echo | awk '{print substr("'"$STR"'",'$POS','$LEN')}'

截取STR的POS开始长度LEN的子串,POS从1开始算。

?

[root@jfht ~]# STR=123456789

[root@jfht ~]# echo "$STR" | awk '{print substr($0,3,4)}'
3456
[root@jfht ~]# POS=3
[root@jfht ~]# LEN=4
[root@jfht ~]# echo "$STR" | awk '{print substr($0,'$POS','$LEN')}'
3456

[root@jfht ctmw]# STR="123? 456? 789"

[root@jfht ctmw]# POS=3
[root@jfht ctmw]# LEN=4
[root@jfht ctmw]# echo "$STR" | awk '{print substr($0,'$POS','$LEN')}'?
3? 4
[root@jfht ctmw]# echo | awk '{print substr("'"$STR"'",'$POS','$LEN')}'
3? 4
[root@jfht ctmw]#

?

?

使用dd命令截取子串

用dd命令来进行字符串截取。

echo "$STR" | dd bs=1 skip=$POS count=$LEN 2>/dev/null

截取STR的POS开始长度LEN的子串,POS从0开始算。

info dd 写道 `bs=BYTES'
??? Both read and write BYTES bytes at a time.
`skip=BLOCKS'
??? Skip BLOCKS `ibs'-byte blocks in the input file before copying.
`count=BLOCKS'
??? Copy BLOCKS `ibs'-byte blocks from the input file, instead of
everything until the end of the file. ?

[root@jfht ~]# STR=123456789
[root@jfht ~]# echo "$STR" | dd bs=1 skip=3 count=4
45674+0 records in
4+0 records out
4 bytes (4 B) copied, 6.553e-05 seconds, 61.0 kB/s
[root@jfht ~]# echo "$STR" | dd bs=1 skip=3 count=4 2>/dev/null
4567[root@jfht ~]# POS=3
[root@jfht ~]# LEN=4
[root@jfht ~]# echo "$STR" | dd bs=1 skip=$POS count=$LEN 2>/dev/null
4567[root@jfht ~]#

?

?

本文链接:http://codingstandards.iteye.com/blog/1164911 ? (转载请注明出处)

返回目录:Java程序员的Bash实用指南系列之字符串处理(目录)?

上节内容:Bash字符串处理(与Java对照) - 25.字符串分割(成数组)

下节内容:Bash字符串处理(与Java对照) - 27.转换大小写

?

  • 相关文章
发表评论
用户名: 匿名