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

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.文件路径字符串的处理

?

?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值