例如,对于字符串a_link_list_java
,使用_
字符将字符串分成两半将导致:a_link_list
和java
。
list_java
将导致:list
和java
。
我想将这两部分存储到两个变量中。
我尝试了该cut
命令,但它仅适用于字符串中显示的一个字符
如何在 bash shell 脚本中完成此操作?
答案1
外壳的参数扩展可以这样做:
$ v="a_link_list_java"
$ printf "%s\n" "${v%_*}" "${v##*_}"
a_link_list
java
但请注意,如果扩展中的模式不匹配,则不会删除任何内容。因此,两个转换都不会改变不带下划线的值:
$ v=foo
$ printf "%s\n" "${v%_*}" "${v##*_}"
foo
foo
答案2
和sed
:
var1=$(sed 's/_[^_]*$//' file)
var2=$(sed 's/.*_//' file)
请注意,这sed
是非常贪婪的,因此在第二种情况下 glob*
吞掉了所有字符,包括前面的下划线_
。
输出:
$ echo "$var1"
a_link_list
$ echo "$var2"
java
答案3
使用awk
您可以将所有内容单独定义为分隔符_
VAR1=$(awk -F'_' '{print $1}' infile.txt)
您可以根据上面的索引打印您想要的字段,而不是$1
指向第一个字段。
或者您可以bash
作为数组使用和读取。
IFS='_' read -r -a array <<< "$myString"
然后只需读取单独的索引号:
echo "${array[2]}"
或者甚至可以简单地使用 bash 参数扩展:
VAR1="${myString%_*}" # will gives you 'a_link_list'
VAR2="${myString##*_}" # will gives you 'java'
VAR3="${VAR1%_*}" # will gives you 'a_link'