我想在具有以下条件的bash shell脚本中拆分字符串。
1)分隔符是变量
2)分隔符是多个角色
示例:
A quick brown fox
var=brown
我想将字符串拆分为A quick
和brown fox
,但使用变量var
作为分隔符,而不是brown
答案 0 :(得分:8)
#!/bin/bash
#variables according to the example
example="A quick brown fox"
var="brown"
#the logic (using bash string replacement)
front=${example%${var}*}
rear=${example#*${var}}
#the output
echo "${front}"
echo "${var}"
echo "${rear}"
答案 1 :(得分:1)
这听起来像你实际要求的那样(保留结果中的分隔符):
str="A quick brown fox"
var="brown "
result=$(echo ${str} | sed "s/${var}/\\n${var}/g")
这可能是您实际意味着的(从原始字符串中删除分隔符):
str="A quick really brown fox"
var=" really "
result=$(echo ${str} | sed "s/${var}/\\n/g")
您可以运行以验证结果:
IFS=$'\n'
for item in ${result[@]}; do
echo "item=${item}."
done
答案 2 :(得分:0)
result=$(echo "${str}" | awk 'gsub("${var}","${var}\n")
答案 3 :(得分:0)
你提出的问题不是很好,因为你的分裂应该显示"A quick "
(带有尾随空格)。您甚至不知道如何给出输出(在一个数组中,在两个单独的变量中......)。从来没有,让我以自己的方式重述你的问题,并回答这个重新提出的问题。如果它不是您想要的,您将知道如何修改原始帖子。
给定字符串s
和正则表达式var
,为数组a
提供两个字段a[0]
和a[1]
,以便连接这两个字段数组a
的数量为s
,a[1] =~ ^var.*
a[1]
为最小(非贪婪)匹配。
嗯,这已经存在于bash中了:
[[ $s =~ ^(.*)($var.*)$ ]]
a=( "${BASH_REMATCH[@]:1}" )
查找
$ s="A quick brown fox"
$ var=brown
$ [[ $s =~ ^(.*)($var.*)$ ]]
$ a=( "${BASH_REMATCH[@]:1}" )
$ declare -p a
declare -a a='([0]="A quick " [1]="brown fox")'
$
答案 4 :(得分:0)
可以使用100%bash内部命令完成:
#!/bin/bash
#variables according to the example
example="A quick brown fox"
var="brown"
#the logic (using bash string replacement)
front=${example%"$var" *}
rear=${example/"$front"/}
#the output
echo "$front"
echo "$rear"