我有一个字符串:
foo="re-9619-add-selling-office";
我想将第二个-
(破折号)上的字符串分解为variable1和variable2。最后是variable1=re-9619
和variable2=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-9619
和second
shell变量的值为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