我想在具有以下条件的 bash shell 脚本中拆分字符串。
1)分隔符是一个变量
2)分隔符是多字符的
例子:
A quick brown fox
var=brown
我想将字符串拆分为A quick
,brown fox
但使用变量var
作为分隔符而不是brown
#!/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}"
可以使用 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"
这听起来像您实际要求的(在结果中保留分隔符):
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
result=$(echo "${str}" | awk 'gsub("${var}","${var}\n")
您的问题不是很好,因为您的拆分应该显示"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")'
$