Bash:替换包含任何字符类型的引号之间的子字符串

时间:2014-07-17 20:01:36

标签: regex string bash replace

我正在尝试使用Bash(版本3.2)脚本编辑字符串的一部分。

例如,在$ line

line='<Coordinate text1="0" coordinateIndex="78?907??" anotherID="9098" yetanoherID="1.2.3" xyz:text="abc"/>'

我需要编辑coordinateIndex的内容(可以有任何字符/任何长度)。我的最后一次尝试(下面)没有给出错误,但也没有解决问题:

echo "${line/coordinateIndex=\"\[(.*)\]\"/coordinateIndex="124"/line}"

我也尝试使用&#34;)&#34;而不是&#34;]&#34 ;;还有。+,等等。

我正在寻找的输出是:

line='<Coordinate text1="0" coordinateIndex="124" anotherID="9098" yetanoherID="1.2.3" xyz:text="abc"/>'

我尝试了基于

的解决方案

Regex Match any string powershell

http://unix.ittoolbox.com/groups/technical-functional/shellscript-l/shell-script-to-replace-string-within-double-quotes-4107915

https://superuser.com/questions/515421/using-sed-get-substring-between-two-double-quotes

但我仍然无法解决这个问题。

感谢任何帮助,谢谢!

2 个答案:

答案 0 :(得分:1)

可以使用perl轻松完成:

#!/bin/bash

str=$(cat << EOF
line='<Coordinate text1="0" coordinateIndex="78?907??" anotherID="9098" yetanoherID="1.2.3" xyz:text="abc"/>'
EOF
)

echo "$str" |perl -pe 's|(coordinateIndex=)".*?"|$1"abc"|g'

输出:

bash test.sh 
line='<Coordinate text1="0" coordinateIndex="abc" anotherID="9098" yetanoherID="1.2.3" xyz:text="abc"/>

答案 1 :(得分:1)

您可以使用Bash正则表达式匹配来完成。

var=coordinateIndex
value=124
if [[ $line =~ $var=\"([0-9|\?]+)\" ]]; then
    echo ${line/$var=\"${BASH_REMATCH[1]}\"/$var=\"$value\"}
fi

这里的关键是知道在coordinateIndex=之后的引号之间可以找到哪种类型的字符。如果您只使用与任何字符匹配的*,那么您最终会匹配并将所有内容替换为变量"中的最终line