将字符串切成两半,最后一个特定字符出现在字符串中

将字符串切成两半,最后一个特定字符出现在字符串中

例如,对于字符串a_link_list_java,使用_字符将字符串分成两半将导致:a_link_listjava

list_java将导致:listjava

我想将这两部分存储到两个变量中。

我尝试了该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' 

相关内容