shell中提取子串

本文介绍在Shell脚本中如何进行字符串长度计算、截取、替换等操作,包括使用特殊符号来提取子串的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shell中提取子串

 
/*
*此文参考地址:
*/

///注意:本人使用ubuntu11.4,使用sh test 运行shell脚本报错,需使用/bin/bash test 运行才能得到正确的结果
shell中字符串的截取
2010-06-24 00:40

str="abc123abcABC"

#计算字符串的长度
echo ${#str} #12

#位置参数有关操作
echo ${#*} #位置参数的个数
echo ${#@} #位置参数的个数和上面的效果一样
echo $* #把所有的位置参数作为一个字符串输出
echo $@ #效果同上
#字串截取
#
# ${string#substring}
# 从$string的左边第一个字符截掉第一个匹配的$substring
# ${string##substring}
# 从$string的左边第一个字符截掉最后一个个匹配的$substring
#
#从左边开始
echo ${str#a*c} #a到c的最短匹配
echo ${str##a*c} #a到c的最长匹配

#从右边开始
echo ${str%a*C} #从右边的最后一个字符开始寻找a到B的最短匹配
echo ${str%%a*B} #从右边最后一个字符开始寻找a到B的最长匹配
#这里找不到模式

#==取子串==
# ${string:position}
# ${string:positon:length}
#
echo ${str:2} #从第2个位置开始提取字符串的值
echo ${str:2:3} #从第2个位置开始提取长度为3个字符的值
#反向提取子串
echo ${str:(-2)} #从反向的第2个位置开始提取字符串
echo ${str:(-2):6} #从反向的第2个字符的位置开始提取长度为6个字符的串(:(不可能把)
#总共的字符长度只有2个怎么提取6个呢呵呵
echo ${str:(-6):3} #6个中提出3个总可以了把

#位置参数的提取

echo ${*:2} #从第二个位置参数开始提取后面所有位置参数的值
echo ${*:2:3} #从第二个位置参数开始提取3个位置参数的值

#=子串替换=
# ${string/substring/replacement}
# 使用$replacement来替换第一个匹配的$substring.
# ${string//substring/replacement}
# 使用$replacement来替换所有匹配的$substring.
#
# ${string/#substring/replacement}
# 如果$substring匹配$string的开头部分,那么就用$replacement来替换$substring.
# ${string/%substring/replacement}
# 如果$substring匹配$string的结尾部分,那么就用$replacement来替换$substring.
#
str1="123abcABCab12"

echo ${str1/12/hover} #仅仅替换了第一个
echo ${str1//12/hover} #替换了所有的

echo ${str1/#12/hover} # 从头开始匹配12,如果找到做替换
echo ${str1/%12/hover} # 从尾开始匹配12,如果找到做替换

### Shell 中操作字符串子串 #### 获取字符串长度 在 Shell 脚本中,有多种方法来获取字符串的长度。一种常见的方式是利用 `expr` 命令配合 `length` 关键字。另一种更为简洁的方法则是通过 `${#variable}` 这样的参数扩展形式[^1]。 ```bash str="example" len=${#str} echo $len # 输出7 ``` #### 字符串截取 对于字符串的截取,Shell 提供了几种不同的机制: - **使用`${string:position:length}`** 此表达式允许从给定位置开始提取特定长度的字符序列。其中 `position` 表示起始索引(基于0),而 `length` 则指定了要取得的字符数。如果省略 `length` ,则会一直读到字符串结尾[^2]。 ```bash string="HelloWorld" substring=${string:0:5} echo $substring # 输出: Hello ``` - **借助`awk`中的`substr()`** 当需要更复杂的逻辑或者与其他文本处理功能集成时,可以考虑调用外部工具如 `awk` 。其内置函数 `substr(s,i,n)` 可用于返回由第 i 个字符开始至多 n 个连续字符组成的片段;当未提供第三个参数 n 时,默认直到结束为止[^4]。 ```bash echo 'abcdefg' | awk '{print substr($0,1,2)}' # 结果为 ab ``` - **运用`expr substr`** 类似于前两种方案,也可以采用 `expr` 实现相同目的。不过需要注意的是,在这里下标是从1开始计数而非零基序号体系下的其他选项[^5]。 ```bash expr substr "abc" 2 2 # 显示 bc ``` #### 查找子字符串的位置 为了定位某个模式首次出现的确切位点,可组合应用 `grep` 和 `cut` 来完成这项工作。具体来说就是先让前者按照二进制流对待输入并仅保留匹配项及其对应的偏移地址,之后再经后者解析输出实际坐标值[^3]。 ```bash str="支持使用不同的客户端转发报文" subStr="转发" pos=$(echo "$str" | grep -bao "${subStr}" | cut -d : -f 1) echo $pos # 输出20 ``` 上述内容涵盖了基本的字符串子串操作技巧,适用于大多数日常编程需求场景之中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值