我正在尝试使用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
https://superuser.com/questions/515421/using-sed-get-substring-between-two-double-quotes
但我仍然无法解决这个问题。
感谢任何帮助,谢谢!
答案 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
。