`

Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串

阅读更多

Bash字符串处理(与Java对照) - 26.根据位置和长度截取子串

In Java

String.substring

String     substring(int beginIndex)
          返回一个新的字符串,它是此字符串的一个子字符串。
 String     substring(int beginIndex, int endIndex)
          返回一个新字符串,它是此字符串的一个子字符串。

 

In Bash

Bash内置的取子串功能

取指定位置开始到串尾的子串,INDEX从0开始算。

${STR:$INDEX}

取指定位置开始、指定长度的子串

${STR:$INDEX:$LENGTH}

与Java不同的是,LENGTH可以大于串的长度。

 

[root@jfht ~]# STR=Hello
[root@jfht ~]# echo ${STR:3}
lo
[root@jfht ~]# echo ${STR:1:2}
el

[root@jfht ~]# echo ${STR:2:10}
llo

 

另外, INDEX还可以是负数,意思是从尾部倒数的位置开始。

但是要注意INDEX的写法,加上小括号,或者在前面加空格或0。

[root@jfht ~]# STR=Hello
[root@jfht ~]# echo ${STR:(-2)}
lo
[root@jfht ~]# echo ${STR:(-3)}
llo
[root@jfht ~]# echo ${STR:-3} 
Hello

-3没有加小括号或前面加空格,就会产生问题。

[root@jfht ~]# echo ${STR: -3}  
llo
[root@jfht ~]# echo ${STR:(-3):2}
ll

[root@jfht ~]# STR=123456789

有文章说也可以在前面加0,试了一下果然可以。
[root@jfht ~]# echo ${STR:0-4}
6789
[root@jfht ~]# echo ${STR:0-4:3}
678

 

补充对${STR:-3}的说明。

man bash 写道
${parameter:-word}
    Use Default Values. If parameter is unset or null, the expansion of word is substituted. Otherwise,
the value of parameter is substituted.

 

使用expr substr取子串

另外也有用expr来取子串的,但效率不如上面。

expr substr "$STR" "$POS" "$LENGTH"

注意:POS从1开始。

man expr 写道
substr STRING POS LENGTH
    substring of STRING, POS counted from 1
 

[root@jfht ~]# STR=Hello

[root@jfht ~]# expr substr "$STR" 2
expr: 语法错误
[root@jfht ~]# expr substr "$STR" 2 1
e
[root@jfht ~]# expr substr "$STR" 2 3
ell
[root@jfht ~]# expr substr "$STR" 2 10
ello

 

使用expr正则表达式匹配功能也可以实现取子串,不过有点杀鸡用牛刀了。

[root@jfht ~]# STR=123456789
[root@jfht ~]# POS=3
[root@jfht ~]# LEN=4
[root@jfht ~]# expr match "$STR" ".\{$POS\}\(.\{$LEN\}\).*"
4567

 

用cut命令截取子串

用cut命令也可以进行字符串截取。

echo "$STR" | cut -c$START-$END

截取STR串中从START开始到END结束的子串,位置从1开始计数。

echo "$STR" | cut -c$START-

截取STR串中从START开始到末尾的子串。

echo "$STR" | cut -c-$END

截取STR串中从头开始到END的子串。

 

[root@jfht ~]# STR=123456789
[root@jfht ~]# echo "$STR" | cut -c3-4
34
[root@jfht ~]# START=3
[root@jfht ~]# END=4
[root@jfht ~]# echo "$STR" | cut -c$START-$END
34

[root@jfht ~]# echo "$STR" | cut -c$START-
3456789

[root@jfht ~]# echo "$STR" | cut -c-$END
1234

 

用awk substr截取子串

用awk命令来进行字符串截取,网上很多例子有错。

echo "$STR" | awk '{print substr($0,'$POS','$LEN')}'

echo | awk '{print substr("'"$STR"'",'$POS','$LEN')}'

截取STR的POS开始长度LEN的子串,POS从1开始算。

 

[root@jfht ~]# STR=123456789

[root@jfht ~]# echo "$STR" | awk '{print substr($0,3,4)}'
3456
[root@jfht ~]# POS=3
[root@jfht ~]# LEN=4
[root@jfht ~]# echo "$STR" | awk '{print substr($0,'$POS','$LEN')}'
3456

[root@jfht ctmw]# STR="123  456  789"

[root@jfht ctmw]# POS=3
[root@jfht ctmw]# LEN=4
[root@jfht ctmw]# echo "$STR" | awk '{print substr($0,'$POS','$LEN')}' 
3  4
[root@jfht ctmw]# echo | awk '{print substr("'"$STR"'",'$POS','$LEN')}'
3  4
[root@jfht ctmw]#

 

 

使用dd命令截取子串

用dd命令来进行字符串截取。

echo "$STR" | dd bs=1 skip=$POS count=$LEN 2>/dev/null

截取STR的POS开始长度LEN的子串,POS从0开始算。

info dd 写道
`bs=BYTES'
    Both read and write BYTES bytes at a time.
`skip=BLOCKS'
    Skip BLOCKS `ibs'-byte blocks in the input file before copying.
`count=BLOCKS'
    Copy BLOCKS `ibs'-byte blocks from the input file, instead of
everything until the end of the file.
 

[root@jfht ~]# STR=123456789
[root@jfht ~]# echo "$STR" | dd bs=1 skip=3 count=4
45674+0 records in
4+0 records out
4 bytes (4 B) copied, 6.553e-05 seconds, 61.0 kB/s
[root@jfht ~]# echo "$STR" | dd bs=1 skip=3 count=4 2>/dev/null
4567[root@jfht ~]# POS=3
[root@jfht ~]# LEN=4
[root@jfht ~]# echo "$STR" | dd bs=1 skip=$POS count=$LEN 2>/dev/null
4567[root@jfht ~]#

 

 

本文链接:http://codingstandards.iteye.com/blog/1164911   (转载请注明出处)

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

上节内容:Bash字符串处理(与Java对照) - 25.字符串分割(成数组)

下节内容:Bash字符串处理(与Java对照) - 27.转换大小写

 

5
4
分享到:
评论

相关推荐

    shell中字符串截取

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

    shell中字符串处理方

    ### Shell中的字符串处理方法 #### 引言 在Shell编程中,字符串...无论是简单的字符串截取还是更复杂的文本分析任务,这些技巧都能提供强大的支持。希望本文介绍的内容能帮助你在日常的Shell编程工作中更加得心应手。

    shell 字符串操作

    子字符串截取** - **${string:position}**: 从指定位置开始截取字符串。 - 示例: ```bash str="Hello World" echo "${str:6}" # 输出: World ``` - **${string:position:length}**: 从指定位置开始截取指定...

    Bash Shell字符串操作小结

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

    bash脚本高级编程指南

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

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

    Shell提供了多种字符串截取方式,如 `${string:offset:length}` 或 `${string: -offset:length}`。例如: ```bash echo ${string:4} # 2342341 从第4位开始截取 echo ${string:3:3} # 123 从第3位开始截取3位 ...

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

    字符串测试运算是用于处理字符串的比较和检查。主要的字符串测试运算包括: - `=`:两个字符串完全相等 - `!=`:两个字符串不相等 - `-z`:字符串长度为0(空字符串) - `-n`:字符串长度不为0(非空字符串) 示例...

    前端开源库-kstr

    3. **截取与修剪**:`kstr` 提供了 `substring` 和 `slice` 方法用于截取字符串,以及 `trim`、`trimStart` 和 `trimEnd` 方法用于去除字符串两端的空白字符。 4. **编码与解码**:支持常见的字符串编码和解码操作...

    Bash-Toolbox-开源

    1. **函数库**: Bash Toolbox 包含了各种预定义的函数,如文件操作、字符串处理、数学计算等,这些函数经过优化,能够提高脚本的可读性和执行效率。 2. **错误处理**: 该项目强调良好的错误处理机制,提供统一的...

    很好的Shell总结教程

    #### 2.4 字符串截取 可以使用`${string%%suffix}`或`${string##prefix}`来去除字符串的前缀或后缀。例如: ```bash str="http://www.example.com" echo "${str##*/}" # 输出:example.com ``` #### 2.5 变量状态...

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

    - **截取子字符串**:`echo ${test:起始位置:长度}`,例如`echo ${test:5:10}`可以截取从第五个字符开始的10个字符。 - **字符串删除**: - `${test#模式}`:从字符串左侧开始删除匹配`模式`的第一个部分。 - `${...

    shell从入门到精通

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

    oracle常用命令

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

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

    2.4 字符串截取 `VAR=${VAR:start:end}` 截取 `VAR` 从索引 `start` 到 `end-1` 的子串。 2.5 变量状态赋值 通过 `${VAR+value}` 和 `${VAR:-value}` 分别表示如果 `VAR` 已定义则输出 `VAR` 的值,否则输出 `value...

    RobotFrameworkString库的常用方法.pdf

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

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

    此外,笔记还介绍了如何使用`cut`命令进行更复杂的字符串截取,这对于处理多列数据文件尤其方便。 除了上述内容,笔记还可能涉及更多章节,如条件语句(if-else)、循环结构(for, while)、函数定义、错误处理、...

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

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

Global site tag (gtag.js) - Google Analytics