如何删除包括下划线之前的字符?

bash脚本中,请执行以下操作的有效方法是什么?

var="fooo_barrrr" 

请删除之前包括'_'的所有字符,以使var变成“barrrr”的最佳方法是什么?

使用参数扩展 :

 $ var="fooo_barrrr" $ echo ${var#*_} barrrr 

要更改var本身, var=${var#*_}

请注意,这取消了第一个_

 $ var="fooo_barrr_r" $ echo ${var#*_} barrr_r 

如果您想删除最后一个,则需要使用##代替:

 $ var="fooo_barrr_r" $ echo ${var##*_} r 

看到一些替代品:

sed

 $ sed 's/^[^_]*_//' <<< "foo_barrrr_r" barrrr_r 

awk

 $ awk 'gsub(/^[^_]*_/,"")1' <<< "foo_barrrr_r" barrrr_r 

grep

 $ grep -oP '[^_]*_\K.*' <<< "foo_barrrr_r" barrrr_r 

在所有情况下,要将新值存储在同一个var中,请执行var=$(command <<< "$var")

或者,使用grep

 echo fooo_barrrr | grep -oP '.*(?=_)' 

要理解每个标志的含义,请使用grep --help

  • -P ,–perl-regexp

    PATTERN是一个Perl正则表达式

  • -o , – 唯一匹配

    仅显示匹配PATTERN的行的部分

为了避免错误的结果,当有两个以上的部分,你可以使用:

 echo fooo_barrrr_xyz | grep -oP '.*?(?=_)' | head -1