`

Bash字符串处理(与Java对照) - 19.查找字符的位置

阅读更多

Bash字符串处理(与Java对照) - 19.查找字符的位置

In Java

String.indexOf & String.lastIndexOf

 int     indexOf(int ch)
          返回指定字符在此字符串中第一次出现处的索引。
 int     indexOf(int ch, int fromIndex)
          从指定的索引开始搜索,返回在此字符串中第一次出现指定字符处的索引。

 

int     lastIndexOf(int ch)
          返回最后一次出现的指定字符在此字符串中的索引。
 int     lastIndexOf(int ch, int fromIndex)
          从指定的索引处开始进行后向搜索,返回最后一次出现的指定字符在此字符串中的索引。

 

StringUtils.indexOf & StringUtils.indexOfAny & StringUtils.indexOfIgnoreCase & StringUtils.lastIndexOf

在 org.apache.commons.lang.StringUtils 中提供了很多查找字符索引的方法,包括正向和反向。

 

static int     indexOf(String str, char searchChar)
          Finds the first index within a String, handling null.
static int     indexOf(String str, char searchChar, int startPos)
          Finds the first index within a String from a start position, handling null.

static int     lastIndexOf(String str, char searchChar)
          Finds the last index within a String, handling null.
static int     lastIndexOf(String str, char searchChar, int startPos)
          Finds the last index within a String from a start position, handling null.

 

在 org.apache.commons.lang.StringUtils 中还提供了查找任意字符出现的位置的方法。
static int     indexOfAny(String str, char[] searchChars)
          Search a String to find the first index of any character in the given set of characters.
static int     indexOfAny(String str, String searchChars)
          Search a String to find the first index of any character in the given set of characters.
static int     indexOfAnyBut(String str, char[] searchChars)
          Search a String to find the first index of any character not in the given set of characters.
static int     indexOfAnyBut(String str, String searchChars)
          Search a String to find the first index of any character not in the given set of characters.

 

In Bash

使用遍历字符的方式来查找字符的位置

函数:strchr <str> <ch>

如果找到,打印字符的位置,从0开始计数,退出码为0;否则打印-1,退出码为1

strchr(){
    local i
    for ((i=0; i<${#1}; ++i))
    do
        if [ "${1:i:1}" == "$2" ]; then
            echo $i
            return 0
        fi
    done
    echo -1
    return 1
}

 

[root@web ~]# STR=123456789
[root@web ~]# CH=6
[root@web ~]# strchr "$STR" "$CH"
5
[root@web ~]# echo $?
0
[root@web ~]# CH=a
[root@web ~]# strchr "$STR" "$CH"
-1
[root@web ~]# echo $?
1
[root@web ~]#

 

用expr index来查找字符的位置

格式:expr index "$STR" "$CHARS"

在STR中查找CHARS中的任何字符(而不是子串),打印第一个位置。

注意:返回的下标是从1开始的,0表示没有找到。

不完全对应于Java的indexOf方法。倒是与C++ STL string的find_first_of相似。

 

man expr 写道
index STRING CHARS
   index in STRING where any CHARS is found, or 0

 

[root@jfht ~]# STR="Hello World"
[root@jfht ~]# SUB="l"
[root@jfht ~]# expr index "$STR" "$SUB"
3

[root@jfht ~]# SUB="not found"      # 注意,expr index并不能用能查找子串的位置,而是该字符串中任何字符首次出现的位置
[root@jfht ~]# expr index "$STR" "$SUB"
5

 

用awk index来查找字符出现的位置

格式1:awk -v "STR=$STR" -v "CH=$CH" '{print index(STR,CH)}' <<<""

格式2:echo | awk -v "STR=$STR" -v "CH=$CH" '{print index(STR,CH)}'

因为awk默认会从标准输入读取数据,所以必须进行输入的重定向。

此方法不仅可以查询字符的出现位置,也可以查询子串的出现位置。但不能查找任意字符的出现位置。

注意:索引位置从1开始计数,0表示没有找到。

man awk 写道
index(s, t) Returns the index of the string t in the string s, or 0 if t is not present. (This
implies that character indices start at one.)
 

[root@web ~]# STR=123456789
[root@web ~]# CH=6

[root@web ~]# awk -v "STR=$STR" -v "CH=$CH" '{print index(STR,CH)}' <<<""
6
[root@web ~]# echo | awk -v "STR=$STR" -v "CH=$CH" '{print index(STR,CH)}'
6
[root@web ~]#

 

 

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

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

上节内容:Bash字符串处理(与Java对照) - 18.格式化字符串

下节内容:Bash字符串处理(与Java对照) - 20.查找子串的位置

 

 

4
3
分享到:
评论

相关推荐

    mysql-connector-java-5.1.40.tar.gz

    MySQL Connector/J是MySQL数据库与Java应用程序之间的桥梁,它是一个实现了JDBC(Java Database Connectivity)标准的MySQL驱动程序。"mysql-connector-java-5.1.40.tar.gz" 是这个驱动程序的一个特定版本,版本号为...

    bash-3.1-MSYS-1.0.11-snapshot.tar

    bash-3.1-MSYS-1.0.11-snapshot.tar.bz2 ffmpeg 安装用包!

    unzip-6.0-19.el7.x86_64.rpm

    《unzip工具在CentOS 7.4中的应用与详解》 在Linux系统中,处理压缩文件是一项常见的任务,尤其在CentOS这样的企业级发行版上。本文将深入探讨"unzip-6.0-19.el7.x86_64.rpm"这个软件包,它是用于解压ZIP格式文件的...

    libaio-devel-0.3.106(i386 x86_64)

    ```bash rpm -ivh libaio-devel-0.3.106-3.2.i386.rpm ``` 而对于 x86_64 系统,则是: ```bash rpm -ivh libaio-devel-0.3.106-3.2.x86_64.rpm ``` 安装完成后,libaio-devel 提供的头文件(如 `libaio.h`)和开发...

    centos安装jdk1.8时出现没有/lib/ld-linux.so.2:这个文件的原因分析

    -bash: /usr/local/jdk/jdk1.8.0_181/bin/java: /lib/ld-linux.so.2: bad ELF interpreter: No such file or directory 安装完后 java -version 查看版本出现: 原因是:没有那个文件或目录,找了很久发现需要...

    fontconfig-2.13.0-4.3.el7.x86_64.zip

    `fontconfig`是一个开源的字体配置库,它负责管理和查找系统中的字体,为应用程序提供统一的接口来处理字体问题。在没有互联网连接或者网络受限的环境中,确保Linux能够正确显示中文字符,就需要手动安装和配置字体...

    mysql-connector-java-8.0.13.jar

    MySQL Connector/J 8.0.13 是MySQL数据库与Java应用程序之间的重要桥梁,它是Oracle官方提供的用于Java平台的MySQL驱动程序。这个jar包允许开发者在Java应用中执行SQL语句,进行数据的读取、写入和管理MySQL数据库。...

    bash-4.1.2-15.el6_5.1.x86_64.rpm

    修复redhat6 bash远程执行任意代码漏洞CVE-2014-6271

    Java-JDK-11.0.8(Windows &amp;amp; Mac os) 下载

    5. **文本块(Text Blocks)**:预览特性,允许在代码中方便地插入多行字符串,减少转义字符的使用。 在下载和安装Java JDK 11.0.8之后,开发者可以使用`javac`编译Java源代码,生成字节码(`.class`文件)。通过`...

    bash-3.2-33.el5.1.x86_64.rpm

    修复bash远程执行漏洞,支持redhat linux 64位操作系统 CVE-2014-6271

    jdk-11.0.16.1-linux-x64-bin.tar

    然后将解压后的目录移动到一个合适的位置,如`/usr/lib/jvm`,并创建符号链接以设置系统默认的Java版本: ```bash sudo mv jdk-11.0.16.1 /usr/lib/jvm/ sudo update-alternatives --install /usr/bin/java java /...

    rlwrap-0.37.tar.gz

    总的来说,rlwrap提供了一种更高效、更易用的方式来与sqlplus交互,尤其是在处理字符编码问题时。对于需要频繁使用sqlplus的数据库管理员和开发者来说,rlwrap是一个非常实用的工具。通过正确配置和使用rlwrap,可以...

    bash补丁包.zip

    bash-3.0-27.0.3.el4.i386.rpm bash-debuginfo-3.0-27.el4.4.i386.rpm 2、rhel 4.x 64位 bash-3.0-27.el4.x86_64.rpm bash-debuginfo-3.0-27.el4.4.x86_64.rpm 3、centos5.x_32 bash-3.2-33.el5.1.i386.rpm bash-3.2...

    protoc.exe和protobuf-java-2.5.0.jar集合

    综上所述,`protoc.exe`和`protobuf-java-2.5.0.jar`是protobuf工具链的关键组成部分,它们一起帮助开发者在Java环境中定义、编译和处理protobuf数据结构。为了充分利用protobuf,开发者需要了解如何编写.proto文件...

    apache-tomcat-7.0.70.tar.gz

    尽管Tomcat不是完整的Java EE应用服务器,但它与Java EE的其他组件(如EJB)可以通过与其他服务器(如JBoss或Glassfish)集成来支持。 **Linux系统**: Linux是一种自由和开放源代码的操作系统,广泛应用于服务器...

    tftp-server-0.42-3.1.i386.rpm.

    《TFTP服务器在RHEL5系统中的应用与配置详解》 TFTP(Trivial File Transfer Protocol,简单文件传输协议)是一种轻量级的文件传输协议,常用于设备初始化、固件更新、网络诊断等场景。在RHEL5(Red Hat Enterprise...

    fonts-chinese-3.02-12.el5.noarch.rpm和fonts-ISO8859-2-75dpi-1.0-17.1.noarch.rpm

    同时,对于需要处理中欧语言的环境,ISO 8859-2字体的提供则至关重要,因为它包含了那些区域的特殊字符,使得文本可以正确地被识别和打印。 总的来说,这两个rpm包提供了必要的字体资源,增强了CentOS系统对中文和...

    arm-linux-gcc-4.4.3.tar.gz

    为了让系统知道新的交叉编译器的位置,需要在用户或系统的`~/.bashrc`或`/etc/bash.bashrc`文件中添加以下内容: ```bash export CC=/usr/local/arm-linux-gcc-4.4.3/bin/arm-linux-gcc export CXX=/usr/local/arm-...

    最新版linux jdk-11.0.8_linux-x64_bin.tar.gz

    4. **文本块(Text Blocks)**:新语法特性,用于处理多行字符串,减少转义字符的使用,提高代码可读性。 5. **改进的垃圾收集器**:包括ZGC(Z Garbage Collector)和Shenandoah,提供了更低的暂停时间,适合大...

    bash-4.1.2-15.el6_5.2.x86_64.rpm

    rhel 6.4 64位 bash漏洞更新包

Global site tag (gtag.js) - Google Analytics