shell中分割字符串之后怎么取得最后一个东西的值?如果可以的话,怎么将分割后的结果保存到一个数组中?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell中分割字符串之后怎么取得最后一个东西的值?如果可以的话,怎么将分割后的结果保存到一个数组中?相关的知识,希望对你有一定的参考价值。

比方说,我有一个路径path="/home/work/hdfs/diff",我想用反斜杠"/"分割字符串,取得最后一个目录的名字diff,我应该怎么做?首先,我是不知道这个目录里面有几个"/"的,也就是说,我不知道分割完之后“diff”是在第几列上。否则的话一个awk命令直接搞定了。
不知道我说明白了没,请shell达人帮忙解答一下哈~

1、首先在shell中,定义一个字符串变量,例:str='bbc123uu789'。

2、使用echo输出变量$str的值,例:#注释:shell中定义变量不需要使用$符号,使用变量的时候需要使用$符号echo $str。

3、使用sed指令,对变量进行处理,例:echo $str|sed 's/./&\\+/g'#注释:sed是文本流的处理指令,不会对原文件的内容造成破坏,同时sed支持正则表达式,所以使用起来特别强大#经过以上简单处理之后,字符之间被+符号分隔开来了。

4、sed指令本身并不会原文本造成破坏,所以,再次输出变量$str,值并未改变。

5、使用空格对字符进行分隔,只需要指定sed语法种的符号即可,例:echo $str|sed 's/./& /g'#注释:掌握了这个,想使用什么符号分隔都可以,在&符号后指定就可以了。

6、扩展一下,按照三个字符一组,对字符串进行分隔,例:echo $str|sed 's/.../& /g'。

参考技术A 有很多命令都可以实现你要求的功能,比如

awk:

echo "1:3:5" | awk -F ":" 'print $NF'

sed:

echo "1:3:5" | sed 's/.*:\([^:]*\)$/\1/'本回答被提问者采纳
参考技术B 这个问题很简单呀,直接使用命令basename获取即可。例如path="/home/work/hdfs/diff"获取diff的命令为:
basename $path
如果想获取/home/work/hdfs这部分内容,可使用命令:
basedir $path追问

我只是举了这么一个例子,并不是说我要解决的问题就是路径的问题。比如这样的问题应该怎么处理:a=“1:2:3:4:5:6:7”,我想得到最后一列的“7”,怎么做?我事先并不知道这里有几列。
如果在perl中,可以使用@t=split /:/,$a这样来做,shell中有类似的做法么?
谢谢!

参考技术C string="1:2:3:4:5:6:7"
array=($string//:/ ) #创建数组
last_value=$array[$#array[*]-1] #获取最后一个元素

Oracle中分割字符串的方法

Oracle中分割字符串的方法

1. 使用 regexp_substr() 函数

1.1 方式1

  • 如下:
    select regexp_substr('bbb,aaa,ccc', '[^,]+', 1, level) as split_result
      from dual
    connect by level <=
               length('bbb,aaa,ccc') - length(replace('bbb,aaa,ccc', ',')) + 1;
    

1.2 方式2

  • 如下:

    select regexp_substr(replace('aaa;bbb;ccb', '', ';'), '[^;]+', 1, level) as split_result
       from dual
     connect by level <= regexp_count('aaa;bb;', ';') + 1;
    

    或者 with 写法,如下

    with temp as
     (select 'bbb,aaa,ccc' as str from dual)
    select regexp_substr(replace(str, ',', ' ,'), '[^,]+', 1, level)
      from temp
    connect by level <= regexp_count(str, ',') + 1
    

1.3 注意问题(尤其是存储过程中用到,可能会入坑)

  • 问题情况(可能会出现空行),如下:

  • 解决问题:
    上述空行不是我们所需要的,所以排除即可,如下:

    select split_result,length(split_result) from (
     select regexp_substr(replace('aaa;bb;', '', ';'), '[^;]+', 1, level) as split_result
       from dual
     connect by level <= regexp_count('aaa;bb;', ';') + 1)
     where split_result is not null;
    


2. 自定义函数

2.1 自定义类型 table

  • 如下:
    create or replace type result_split_list as table of varchar2(100);
    

2.2 自定义函数

2.2.1 自定义函数

  • 如下:
    create or replace function split_strs(strs varchar2, type_split varchar2)
      return result_split_list
      pipelined is
      index_num  pls_integer;
      str_list varchar2(100) := strs;
    begin
      loop
        index_num := instr(str_list, type_split);
        if index_num > 0 then
          pipe row(substr(str_list, 1, index_num - 1));
          str_list := substr(str_list, index_num + length(type_split));
        else
          pipe row(str_list);
          exit;
        end if;
      end loop;
      return;
    end split_strs;
    

2.2.2 效果如下:

  • 如下:

2.3 Oracle查看<Collection> 类型数据

  • 上面的效果我们看到查看到的是<Collection> 类型,不方便查看数据,处理如下:
    select * from table (select split_strs('aaa,bbb,ccc',',') from dual);
    

3.

以上是关于shell中分割字符串之后怎么取得最后一个东西的值?如果可以的话,怎么将分割后的结果保存到一个数组中?的主要内容,如果未能解决你的问题,请参考以下文章

SQLSERVER中分割字符串成多列

swift 在swift中分割一个字符串

Oracle中分割字符串的方法

在Bundle中传递多个值,在最后一个字符串中分配的值被传递给所有字符串

关于java中分割字符串

python中分割字符串split切割并选择输出 逐行读取文件后字符串拼接