2

我想在具有以下条件的 bash shell 脚本中拆分字符串。

1)分隔符是一个变量

2)分隔符是多字符的

例子:

A quick brown fox
var=brown

我想将字符串拆分为A quickbrown fox但使用变量var作为分隔符而不是brown

4

5 回答 5

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}"
于 2014-03-17T15:09:47.090 回答
1

可以使用 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"
于 2013-11-11T19:04:17.400 回答
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
于 2013-11-10T03:19:12.547 回答
0
result=$(echo "${str}" | awk 'gsub("${var}","${var}\n")
于 2013-11-10T04:50:13.847 回答
0

您的问题不是很好,因为您的拆分应该显示"A quick "(带有尾随空格)。你甚至不知道你希望如何给出输出(在一个数组中,在两个单独的变量中......)。永远不要,让我以我的方式重新表述你的问题,并回答这个重新表述的问题。如果这不是您想要的,您将知道如何修改您的原始帖子。

给定一个字符串s和一个正则表达式var,给一个包含两个字段的数组,并且使得数组a的两个字段a[0]的连接是a[1]最小a的(非贪婪的)匹配。sa[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")'
$
于 2013-11-10T18:33:23.517 回答