shell字符串处理

字符串长度

shell>echo ${#string}
shell>expr length $string
shell>expr "$string" : '.*'

 匹配字符串开头的子串长度

expr match "$string" '$substring'
     $substring 是一个正则表达式.
expr "$string" : '$substring'

 索引

expr index $string $substring

 提取子串

${string:position}
     在$string 中从位置$position开始提取子串.
     如果$string 是"*"或者" @ ", 那么将会提取从位置$position开始的位置参数. [1]
${string:position:length}
     在$string 中从位置$position开始提取$length 长度的子串.
stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.
echo ${stringZ:0}                     # abcABC123ABCabc
echo ${stringZ:1}                     # bcABC123ABCabc
echo ${stringZ:7}                     # 23ABCabc
echo ${stringZ:7:3}                   # 23A
                                       # 提取子串长度为3.
# 能不能从字符串的右边(也就是结尾)部分开始提取子串?
echo ${stringZ:-4}                    # abcABC123ABCabc
# 默认是提取整个字符串, 就象${parameter:-default} 一样.
# 然而 . . .
echo ${stringZ:(-4)}                  # Cabc
echo ${stringZ: -4}                   # Cabc 注意,":"右边有一个空格!
# 这样, 它就可以工作了.
# 使用圆括号或者添加一个空格可以"转义"这个位置参数.

如果$string 参数是"*"或" @ ", 那么将会从$position位置开始提取 $length 个位置参数, 但是由于
可能没有$length 个位置参数了, 那么就有几个位置参数就提取几个位置参数.

echo ${*:2}  # 打印出第2个和后边所有的位置参数.
echo ${@:2}  # 同上.
echo ${*:2:3}  # 从第2个开始, 连续打印3个位置参数.

 

expr substr $string $position $length
     在$string 中从$position开始提取$length 长度的子串.

echo `expr substr $stringZ 1 2`
echo `expr substr $stringZ 4 3`

expr match "$string" '\($substring\)'
     从$string 的开始位置提取$substring , $substring 是正则表达式.
expr "$string" : '\($substring\)'
     从$string 的开始位置提取$substring , $substring 是正则表达式.

stringZ=abcABC123ABCabc
#       =======
echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'`
echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'`
echo `expr "$stringZ" : '\(.......\)'`
# 上边的每个echo 都打印出相同的结果.  abcABC1

expr match "$string" '.*\($substring\)'
     从$string 的结尾提取$substring , $substring 是正则表达式.
expr "$string" : '.*\($substring\)'
     从$string 的结尾提取$substring , $substring 是正则表达式.

expr match "$stringZ" '.*\([A-C][A-C][A-C][a-c]*\)'
ABCabc
expr "$stringZ" : '.*\(......\)'
ABCabc

子串削除

${string#substring}
     从$string 的开头位置截掉最短匹配的$substring .
${string##substring}
     从$string 的开头位置截掉最长匹配的$substring .

${string%substring}
     从$string 的结尾位置截掉最短匹配的$substring .
${string%%substring}
     从$string 的结尾位置截掉最长匹配的$substring .

echo ${stringZ%b*c}        # abcABC123ABCa
# 从$stringZ 的结尾位置截掉'b' 到'c' 之间最短的匹配.
echo ${stringZ%%b*c}     #a
# 从$stringZ 的结尾位置截掉'b' 到'c' 之间最长的匹配.

另: 关于子串削除,分享一个小例子:

[root@lin2 shell]$aa="/root/aaa/aaa"           #当然,根据需求,此处还可以用 "dirname"实现!
[root@lin2 shell]$echo ${aa%/[a-z]+}           #应该是echo支持的正则有效?还是这个子串削除的原因!除了"+"的匹配,还有"."貌似也不支持额…
/root/aaa/aaa
[root@lin2 shell]$echo ${aa%/[a-z]*}
/root/aaa

当你需要构造文件名的时候, 这个操作就显得特别有用.

再分享一个哈【转】

#!/bin/bash

num=1
for i in *.tar *.tar.gz
do
new=new_$num.${i#*.}
mv $i $new 2>/dev/null

if [ $? -eq 0 ];then
    echo "remove $i to $new"
    let num++
fi

done

# touch test{1..5}.tar test{1..5}.tar.gz
# ls
test1.tar     test2.tar     test3.tar     test4.tar     test5.tar     test.sh
test1.tar.gz  test2.tar.gz  test3.tar.gz  test4.tar.gz  test5.tar.gz
# ./test.sh
remove test1.tar to new_1.tar
remove test2.tar to new_2.tar
remove test3.tar to new_3.tar
remove test4.tar to new_4.tar
remove test5.tar to new_5.tar
remove test1.tar.gz to new_6.tar.gz
remove test2.tar.gz to new_7.tar.gz
remove test3.tar.gz to new_8.tar.gz
remove test4.tar.gz to new_9.tar.gz
remove test5.tar.gz to new_10.tar.gz
#

子串替换

${string/substring/replacement}
     使用$replacement 来替换第一个匹配的$substring .
${string//substring/replacement}
     使用$replacement 来替换所有匹配的$substring .

${string/#substring/replacement}
     如果$substring 匹配$string 的开头部分, 那么就用$replacement 来替换$substring .
${string/%substring/replacement}
     如果$substring 匹配$string 的结尾部分, 那么就用$replacement 来替换$substring

     
[从书本上摘录下来,对于字符串的处理,熟练运用了Bash提供的这些操作,一般的应用还是都能处理好]

[“无他,唯手熟尔”]
                      

时间: 2024-07-30 17:03:24

shell字符串处理的相关文章

linux shell 字符串操作(长度,查找,替换)详解_linux shell

在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快. 一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那

Shell字符串比较相等、不相等方法小结_linux shell

#!/bin/sh #测试各种字符串比较操作. #shell中对变量的值添加单引号,爽引号和不添加的区别:对类型来说是无关的,即不是添加了引号就变成了字符串类型, #单引号不对相关量进行替换,如不对$符号解释成变量引用,从而用对应变量的值替代,双引号则会进行替代 #author:tenfyguo A="$1" B="$2" echo "输入的原始值:A=$A,B=$B" #判断字符串是否相等 if [ "$A" = "

shell 字符串 查找 替换 正则 操作

工作中字符串操作举例 filename='/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg' #下面是使用shell字符串操作 buName1=${filename#*/jobs/} #去除'/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg'前缀得到'CnClickstat/DFSLoader/loader.cfg' buName1=${buName1%%/*} #去除'CnClickstat/D

shell 字符串操作(长度,查找,替换)详解_linux shell

复制代码 代码如下: 工作中字符串操作举例 filename='/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg' #下面是使用shell字符串操作 buName1=${filename#*/jobs/} #去除'/home/admin/jobs/CnClickstat/DFSLoader/loader.cfg'前缀得到'CnClickstat/DFSLoader/loader.cfg' buName1=${buName1%%/*} #去除'Cn

Oracle技术:Shell字符串比较

Shell 中整数比较方法及字符串的比较方法,如等于,不等于,大于,大于等于,小于,等等. 二元比较操作符,比较变量或者比较数字.注意数字与字符串的区别. -------------------------------------------------------------------------------- 1.整数比较 -eq       等于,如:if [ "$a" -eq "$b" ] -ne       不等于,如:if [ "$a&quo

Shell字符串截取的详细方法_linux shell

一.Linux shell 截取字符变量的前8位,有方法如下: 复制代码 代码如下: 1.expr substr "$a" 1 82.echo $a|awk '{print substr(,1,8)}'3.echo $a|cut -c1-84.echo $5.expr $a : '\(.\\).*'6.echo $a|dd bs=1 count=8 2>/dev/null 二.按指定的字符串截取1.第一种方法:${varible##*string} 从左向右截取最后一个strin

shell字符串操作详解_linux shell

1.shell变量声明的判断 表达式 含义 ${var} 变量var的值, 与$var相同 ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 * ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 * ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 * ${

linux shell字符串内置的常用操作(获取长度、查找、替换)_linux shell

在编写shell程序时,经常会涉及到字符串相关操作.有许多命令语句,如awk,sed都能够做字符串各种操作. 事实上shell内置一系列操作符号,能够达到相似效果,使用内部操作符会省略启动外部程序等时间,因此速度会很的快.如果内置的操作符能够做到的,优先使用内置的. 1 读取字符串值 表达式 含义 ${var} 变量var本来的值 ${var-default} var没声明返回default,但不改变var的值 ${var:-default} var没声明或其值为空返回default,但不改变v

linux shell 字符串操作(长度,查找,替换)详解

原文地址:http://www.cnblogs.com/chengmo/archive/2010/10/02/1841355.html   在做shell批处理程序时候,经常会涉及到字符串相关操作.有很多命令语句,如:awk,sed都可以做字符串各种操作. 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快.   一.判断读取字符串值 表达式 含义 ${var} 变量var的值, 与$var相同     ${var-DEFAU