`

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

 

 

2
2
分享到:
评论

相关推荐

    shell中字符串截取

    ### Shell中字符串截取 在Shell脚本编程中,对字符串进行截取是常见的操作之一。通过对字符串的处理,可以实现各种数据解析、文件名提取等实用功能。本文将详细介绍几种常用的Shell中字符串截取方法及其应用场景。 ...

    shell 字符串操作

    Shell还提供了一系列内置的操作来处理字符串,如截取、替换等。 **1. 字符串长度** - **${#string}**: 返回字符串的长度。 - 示例: ```bash str="Hello World" echo "${#str}" # 输出: 11 ``` **2. 子字符...

    shell中字符串处理方

    ### Shell中的字符串处理方法 #### 引言 在Shell编程中,字符串处理是一项重要的技能,尤其是在Linux环境下。本文将深入探讨几种高效的字符串处理技术,并通过实际示例展示这些技巧的应用场景。 #### 字符串截断 ...

    Bash Shell字符串操作小结

    本文将对Bash Shell字符串操作进行详细的总结,包括取长度、查找位置、选取与截取子串、字符串替换以及比较和连接等方法。 1. **取长度** 取得字符串长度有两种方式。第一种是使用`expr length`命令,如`expr ...

    前端开源库-kstr

    2. **搜索与替换**:库内包含查找和替换字符串中的特定子串的方法,如 `contains`、`startsWith` 和 `endsWith`,以及 `replace` 函数,可以方便地进行文本匹配和替换。 3. **截取与修剪**:`kstr` 提供了 `...

    总结的7个shell字符串操作方法和实例分享

    在Shell脚本编程中,字符串处理是不可或缺的一部分。本文将详细介绍7种常用的Shell字符串操作方法,并通过实例进行演示,帮助读者更好地理解和应用这些技巧。 1. **获取字符串长度** 获取字符串长度通常使用`${#...

    bash脚本高级编程指南

    - `substring`可通过`${字符串:开始位置[:长度]}`截取子串。 - `${#变量名}`返回字符串长度,`expr index "$字符串" 字符`查找子串位置。 9. **正则表达式** - 使用`=~`操作符在`[[ ... ]]`条件测试中进行正则...

    Bash-Toolbox-开源

    - `replace_string`: 在字符串中替换子串。 #### 3. 数学运算 - `add_numbers`: 对两个数字进行加法运算。 - `subtract_numbers`: 减法运算。 - `multiply_numbers`: 乘法运算。 - `divide_numbers`: 除法运算...

    总结搜集的shell脚本学习笔记(完结篇).pdf

    Shell提供了丰富的字符串操作功能,包括截取、替换、连接等。基本语法如下: ```bash string="example" substring=${string:2:3} # 截取从第3个字符开始的3个字符 replaced_string=${string/old/new} # 替换第一个...

    Linux入门-shell编程-适合小白.docx

    - 截取字符串从第五个字符开始的子串,`echo ${test:5}`输出"e china"。 - 删除字符串前缀"/",使用`echo ${test#/}`保留"c:/windows/boot.ini"。 - 删除最短匹配的前缀"/",`echo ${test#*/}`得到"windows/boot.ini...

    很好的Shell总结教程

    使用`${string/old/new}`可以替换字符串中的子串。例如: ```bash str="Hello World" new_str="${str/World/Universe}" echo "$new_str" # 输出:Hello Universe ``` #### 2.4 字符串截取 可以使用`${string%%...

    oracle常用命令

    - **Replace(旧字符串, 新字符串)**: 替换字符串中的子串。 - **Substr(字符串, 开始位置, 截取数量)**: 截取字符串的一部分。 2. **数字函数** - **Round(数字, 保留小数点后位数)**: 对数字进行四舍五入。 - ...

    Shell从入门到工作几百页笔记.pdf

    替换字符串功能允许你在字符串中查找并替换特定的子串,这对于数据清洗或者信息提取非常关键。此外,笔记还介绍了如何使用`cut`命令进行更复杂的字符串截取,这对于处理多列数据文件尤其方便。 除了上述内容,笔记...

    shell从入门到精通

    2. 字符串处理:Shell脚本中常常需要处理字符串,例如获取字符串长度、字符串切片、替换字符串、截取子串等。Shell提供了丰富的字符串操作功能。 3. 表达式与运算符:Shell脚本支持条件表达式、比较符(包括整数...

    Shell从入门到精通(带标签的版本)1

    **第二章 Shell 字符串处理之`${}`** 2.1 获取字符串长度 使用 `${#VAR}` 获取变量 `VAR` 的长度,如 `echo ${#NAME}` 输出 `NAME` 变量的长度。 2.2 字符串切片 用 `${VAR:START:length}` 获取 `VAR` 从索引 `...

    RobotFrameworkString库的常用方法.pdf

    总的来说,Robot Framework String 库提供了丰富的字符串处理功能,可以帮助我们在自动化测试中进行字符串的清理、截取等操作。同时,对于遇到的编码和库安装问题,也提供了相应的解决策略。通过熟练掌握这些知识,...

    shell入门学习笔记

    【Shell入门学习笔记】 ...以上是Shell的基础知识,包括脚本编写、变量管理、字符串处理、数组、命令及运算符的使用,这些构成了编写Shell脚本的基本框架。通过深入学习和实践,可以编写出高效且功能丰富的自动化脚本。

    Shell中的${}、##和%%使用范例

    通过使用特定的语法结构,如`${}`、`##`和`%%`,我们可以对变量进行各种操作,比如字符串截取、替换等。这些操作可以帮助我们更灵活地控制数据流,实现更复杂的脚本逻辑。 #### 变量扩展与模式匹配 在Shell中,变量...

Global site tag (gtag.js) - Google Analytics