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

whats 2011-10-26

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

In Java

字符串替换

 String     replace(char oldChar, char newChar)

返回一个新的字符串,它是通过用newChar替换此字符串中出现的所有oldChar而生成的。

Stringreplace(CharSequencetarget,CharSequencereplacement)

          使用指定的字面值替换序列替换此字符串匹配字面值目标序列的每个子字符串。

 String     replaceAll(String regex, String replacement)

使用给定的replacement字符串替换此字符串匹配给定的正则表达式的每个子字符串。

StringreplaceFirst(Stringregex,Stringreplacement)

          使用给定的 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}

HellOWorld

[root@jfht~]#echo${STR//o/O}

HellO WOrld

[root@jfht ~]# STR="Hello World"

[root@jfht~]#echo${STR/#He/he}

helloWorld

[root@jfht~]#echo${STR/#o/he}

HelloWorld

[root@jfht~]#echo${STR/%He/he}

HelloWorld

[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}

lloWorld

[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*}

HelloW

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

Hell

[root@jfht ~]# SUFFIX="o*"

[root@jfht~]#echo${STR%$SUFFIX}

HelloW

[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"|seds/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 ~]#

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

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

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

相关推荐