0

我有一个具有以下格式的字符串:

aa_bb_cc_dd
aa_bb_cc_dd_ee_ff

我想获得:

bb_cc
bb_cc_dd_ee

我试过'cut',但我没能得到我想要的。

4

2 回答 2

3

使用时,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。删除匹配的后缀模式

于 2013-11-06T09:16:40.137 回答
2

使用

$ 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 中的字段数。

使用

$ 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/_[^_]*$//'_从最后到行尾删除。
于 2013-11-06T09:12:18.540 回答