Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取_JAVA_编程开发_程序员俱乐部

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

Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取

 2011/10/28 8:18:15  codingstandards  http://codingstandards.iteye.com  我要评论(0)
  • 摘要:Bash字符串处理(与Java对照)-23.字符串替换、子串删除、子串截取InJava字符串替换Stringreplace(charoldChar,charnewChar)返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的。Stringreplace(CharSequencetarget,CharSequencereplacement)使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。StringreplaceAll
  • 标签:Bash Java 字符串

Bash字符串处理(与Java对照) - 23.字符串替换、子串删除、子串截取

In Java

字符串替换

?String ??? replace(char oldChar, char newChar)
????????? 返回一个新的字符串,它是通过用 newChar 替换此字符串中出现的所有 oldChar 而生成的。
?String ??? replace(CharSequence target, CharSequence replacement)
????????? 使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。

?

?String ??? replaceAll(String regex, String replacement)
????????? 使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的每个子字符串。
?String ??? replaceFirst(String regex, String replacement)
????????? 使用给定的 replacement 字符串替换此字符串匹配给定的正则表达式的第一个子字符串。

?

子串删除

str.replace("substr_to_remove", "");

?

子串截取

参见 ”Bash字符串处理(与Java对照) - 21.字符串正则匹配 “ 的”字符串提取“部分。

?

In Bash

基于Pattern Matching的子串替换

${STR/$OLD/$NEW}

替换第一个。

${STR//$OLD/$NEW}

替换所有。

注意:不能使用正则表达式,只能使用?*的Shell扩展。只能用shell通配符如 * ? ?[list] [!list] [a-z]。

${STR/#$OLD/$NEW}

替换开头。如果STR以OLD串开头,则替换。

${STR/%$OLD/$NEW}

替换结尾。如果STR以OLD串结尾,则替换。

?

[root@jfht ~]# STR="Hello World"
[root@jfht ~]# echo ${STR/o/O}
HellO World
[root@jfht ~]# echo ${STR//o/O}
HellO WOrld

[root@jfht ~]# STR="Hello World"
[root@jfht ~]# echo ${STR/#He/he}
hello World
[root@jfht ~]# echo ${STR/#o/he}
Hello World
[root@jfht ~]# echo ${STR/%He/he}
Hello World
[root@jfht ~]# echo ${STR/%ld/lD}
Hello WorlD

?

如果被替换串包含/字符,那么要转义,写成\/。

?

[root@jfht ~]# filename="/root/admin/monitoring/process.sh"
[root@jfht ~]# echo ${filename/#\/root/\/tmp}
/tmp/admin/monitoring/process.sh
[root@jfht ~]# echo ${filename/%.*/.ksh}
/root/admin/monitoring/process.ksh
[root@jfht ~]#

?

将环境变量PATH的各个目录分开,每行显示一个。

echo -e ${PATH/:/\n}

?

[root@jfht ctmw]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/apache/apache-ant-1.7.1/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

[root@jfht ctmw]# echo -e ${PATH//:/'\n'}
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/root/bin

[root@jfht ctmw]# echo "${PATH//:/$'\n'}"
/usr/kerberos/sbin
/usr/kerberos/bin
/usr/apache/apache-ant-1.7.1/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/root/bin

?

基于Pattern Matching的子串删除

子串删除是一种特殊的替换

${STR/$SUB}

将STR中第一个SUB子串删除

${STR//$SUB}

将STR中所有SUB子串删除

${STR#$PREFIX}

去头,从开头去除最短匹配前缀

${STR##$PREFIX}

去头,从开头去除最长匹配前缀

${STR%$SUFFIX}

去尾,从结尾去除最短匹配后缀

${STR%%$SUFFIX}

去尾,从结尾去除最长匹配后缀

注意:经常会记错#和%的含义,有一个帮助记忆的方法

看一下键盘,#在$之前,%在$之后,就知道#去头,%去尾。

注意:不能使用正则表达式,只能使用?*的Shell扩展。

?

[root@jfht ~]# STR="Hello World"
[root@jfht ~]# echo ${STR#He}
llo World
[root@jfht ~]# echo ${STR#He*o}
World
[root@jfht ~]# echo ${STR##He*o}
rld

[root@jfht ~]# PREFIX="*o"
[root@jfht ~]# echo ${STR#$PREFIX}
World
[root@jfht ~]# echo ${STR##$PREFIX}
rld

[root@jfht ~]# echo ${STR%o*}
Hello W
[root@jfht ~]# echo ${STR%%o*}
Hell

[root@jfht ~]# SUFFIX="o*"
[root@jfht ~]# echo ${STR%$SUFFIX}
Hello W
[root@jfht ~]# echo ${STR%%$SUFFIX}
Hell

?

典型应用:得到文件的扩展名

[root@jfht ~]# FILE=hello.jpg
[root@jfht ~]# echo ${FILE##*.}
jpg

?


使用sed命令实现正则表达式替换

使用sed命令可以进行正则表达式的替换。

echo "$STR" | sed "s/$OLD/$NEW/"

将STR中的OLD子串替换成NEW。

?

[root@jfht ~]# STR="123456789"
[root@jfht ~]# echo "$STR" | sed s/345/OK/
12OK6789
[root@jfht ~]# OLD=345
[root@jfht ~]# NEW=OK
[root@jfht ~]# echo "$STR" | sed "s/$OLD/$NEW/"
12OK6789

?

使用tr命令实现字符集合的替换

使用tr命令可以实现字符的替换,并且可以是从一批字符到另一批字符的替换。比如小写字母变成大写字母,或者反过来。

?

[root@jfht ~]# echo "bash" | tr "[a-z]" "[b-z]"
cbti

上面的命令是将原串中的a替换成b,被替换成c,以此类推。

?

网上问题:Linux中 有没有一个命令可以将 字符串中出现的 +或者- 替换成对应的-或者+? 即 "+" ——> "-"? "-"——>"+"? 例如 GMT+8-9变成 GMT-8+9

?

[root@jfht ~]# echo "GMT+8-9" | sed 's/-/#/g' | sed 's/+/-/g' | sed 's/#/+/g'
GMT-8+9

上面是网上提供的答案。如果用tr来实现,更简洁些。
[root@jfht ~]# echo "GMT+8-9" | tr "+-" "-+"
GMT-8+9

?

路径字符串的处理

dirname ${FULLPATH}

取目录部分。

basename ${FULLPATH}

文件名部分。

basename ${FULLPATH} ${EXT}

取文件名部分,并且去掉指定的扩展名。


[root@jfht ~]# FULLPATH=/root/work/project/backup.tar.gz
[root@jfht ~]# dirname "$FULLPATH"
/root/work/project
[root@jfht ~]# basename "$FULLPATH"? ?
backup.tar.gz
[root@jfht ~]# basename "$FULLPATH" .gz
backup.tar
[root@jfht ~]# basename "$FULLPATH" .tar
backup.tar.gz
[root@jfht ~]# basename "$FULLPATH" .tar.gz
backup


取目录部分:${FULLPATH%/*}????

(类似 dirname "$FULLPATH")

取文件名称:FILE=${FULLPATH##*/}

(类似 basename "$FULLPATH")

取最短基本名称:${FILE%%.*}

取最长基本名称:${FILE%.*}

取最短扩展名:${FILE##*.}? 或者? ${FULLPATH##*.}

取最长扩展名:${FILE#*.}? 或者? ${FULLPATH#*.}

?

[root@jfht ~]# FULLPATH=/root/work/project/backup.tar.gz
[root@jfht ~]# echo ${FULLPATH%/*}
/root/work/project
[root@jfht ~]# dirname "$FULLPATH"
/root/work/project
[root@jfht ~]# FILE=${FULLPATH##*/}
[root@jfht ~]# echo $FILE
backup.tar.gz
[root@jfht ~]# basename "$FULLPATH"
backup.tar.gz
[root@jfht ~]# echo ${FILE%%.*}
backup
[root@jfht ~]# echo ${FILE%.*}
backup.tar
[root@jfht ~]# echo ${FILE##*.}
gz
[root@jfht ~]# echo ${FILE#*.}
tar.gz
[root@jfht ~]#

?

?

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

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

上节内容:Bash字符串处理(与Java对照) - 22.判断字符串是否数字串

下节内容:Bash字符串处理(与Java对照) - 24.文件路径字符串的处理

?

?

发表评论
用户名: 匿名