我有一个具有以下格式的字符串:
aa_bb_cc_dd
aa_bb_cc_dd_ee_ff
我想获得:
bb_cc
bb_cc_dd_ee
我试过'cut',但我没能得到我想要的。
使用时,bash
您可以为此任务使用内置函数:
strip_headtail() {
local s=$1
## strip the head
s=${s#*_}
## strip the tail
s=${s%_*}
echo ${s}
}
strip_headtail aa_bb_cc_dd
strip_headtail aa_bb_cc_dd_ee_ff
您可能需要查看 bash 手册 ( man bash
) 以获取更多信息。搜索删除匹配的前缀模式resp。删除匹配的后缀模式。
使用awk:
$ echo "aa_bb_cc_dd
aa_bb_cc_dd_ee_ff" | awk -F_ '{for(i=1;i<NF;i++) $i=$(i+1); NF=NF-2}1' OFS=_
bb_cc
bb_cc_dd_ee
-F_
并将OFS=_
输入和输出字段分隔符设置为_
.{for(i=1;i<NF;i++) $i=$(i+1); NF=NF-2}
将每个字段设置为下一个字段,因此第 n 个将是第 (n+1) 个。然后,减少 2 中的字段数。使用sed:
$ echo "aa_bb_cc_dd
aa_bb_cc_dd_ee_ff" | sed -e 's/^[^_]*_//' -e 's/_[^_]*$//'
bb_cc
bb_cc_dd_ee
sed -e
用于执行多个命令。's/^[^_]*_//'
从头到尾删除_
。's/_[^_]*$//'
_
从最后到行尾删除。