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中有类似的做法么?
谢谢!
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中分割字符串之后怎么取得最后一个东西的值?如果可以的话,怎么将分割后的结果保存到一个数组中?的主要内容,如果未能解决你的问题,请参考以下文章