在bash中剪切字符串的第一部分和最后部分

时间:2013-11-06 09:10:44

标签: bash cut

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

aa_bb_cc_dd
aa_bb_cc_dd_ee_ff

我想获得:

bb_cc
bb_cc_dd_ee

我尝试'切',但我无法获得我想要的东西。

2 个答案:

答案 0 :(得分: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-manual(man bash)以获取更多相关信息。 搜索删除匹配的前缀模式 resp。 删除匹配的后缀模式

答案 1 :(得分: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/_[^_]*$//'从上一个_删除到行尾。