如何删除下划线前后的字符?

时间:2015-06-16 10:52:24

标签: linux string bash unix awk

在bash脚本中,有什么方法可以做到以下几点?

var="fooo_barrrr"

除了'_'之前删除所有字符以便var变成“barrrr”的最佳方法是什么?

2 个答案:

答案 0 :(得分:5)

使用Parameter Expansion

$ 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")

答案 1 :(得分:1)

或者,使用grep

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

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

  • -P, - pel-regexp

    PATTERN是一个Perl正则表达式

  • -o, - 仅匹配

    仅显示与PATTERN匹配的部分

为了避免在有两个以上的部分时出现错误结果,您可以使用:

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