如何在第二个匹配上分割字符串



我有一个字符串:

foo="re-9619-add-selling-office";

我想将第二个-(破折号)上的字符串分解为variable1和variable2。最后是variable1=re-9619variable2=add-selling-office

我尝试使用grep和awk,但现在我不确定这是一种方法。

这是一个单一的sed + read方式:

foo="re-9619-add-selling-office"
read var1 var2 < <(sed -E 's/^([^-]*-[^-]*)-/1 /' <<< "$foo")
# check variables
declare -p var1 var2
declare -- var1="re-9619"
declare -- var2="add-selling-office"

请尝试以下一次。其中first变量的值为re-9619secondshell变量的值为add-selling-office

first=$(echo "$foo" | sed 's/([^-]*-[^-]*)-.*/1/')
second=$(echo "$foo" | sed 's/([^-]*)-([^-]*)-(.*)/3/')

解释:

  • echo "$foo" | sed 's/([^-]*-[^-]*)-.*/1/':打印foo变量的值并将其输出传递给sed命令。在sed中,我使用替代功能来执行替换,([^-]*-[^-]*)-.*(其中包含从值开始到-第二次出现的所有内容)。然后将整个值替换为第一次捕获的返回参考值,该参考值将仅为re-9619
  • echo "$foo" | sed 's/([^-]*)-([^-]*)-(.*)/3/':逻辑与上述命令相同。利用sed的代入能力和它的反向引用能力。这里我们打印-第二次出现之后的所有内容。

注意:second=$(echo "$foo" | sed -E "s/$first-(.*)/1/")也可以帮助@User123的评论。

这可以使用参数展开来完成,不需要外部实用程序。

$ foo="re-9619-add-selling-office"
$ variable2=${foo#*-*-}
$ variable1=${foo%-"$variable2"}
$
$ echo $variable1
re-9619
$ echo $variable2
add-selling-office

您可以使用cut:

variable1=$(echo $foo | cut -d '-' -f 1-2)
variable2=$(echo $foo | cut -d '-' -f 3-)

结果如下:

>> echo $variable1
re-9619
>> echo $variable2
add-selling-office

相关内容

  • 没有找到相关文章

最新更新