使用sed查找和替换一系列数字

3

首先介绍一下自己。

我正在尝试使用sed查找和替换一个词。代码如下:

configFile=ConnectionConfig.xml
sed 's/30??\" authentication=\"someuniqueauthkey/'$1'\" authentication=\"someuniqueauthkey/' $configFile

我会按照以下方式来运行这个文件:

./choosePort.sh 3001

当我运行这段代码时,并没有出现错误提示,例如不良的正则表达式格式,它只是没有替换任何内容,tempXml.xml文件的内容仍然是ConnectionConfig的内容,没有变化。
我想要实现的功能是,在表达式的30??部分识别任何3000-3099之间的数字,我原本以为'?'可以实现这个功能。
我正在尝试更改的输入行是:
<host id="0" address="someip" port="3001" authentication="someauthkey"

提前感谢你的帮助。 (出于安全考虑,文件中的IP和授权密钥已被隐藏)。


你能否将代码精简到与sed直接相关的部分?并且你能否发布一些输入文件的部分内容? - user647772
30?? 应该是什么意思?你想用这个匹配什么?为什么要在单引号内转义双引号? - user647772
30?? 应该是 30,然后再加上任意两个字符。 - Jarob22
我在单引号内转义双引号,因为双引号是字符串的一部分。 - Jarob22
4个回答

4

使用 [0-9] 代替 ? 来匹配一个数字。

sed 's/30[0-9][0-9]\" authentication=\"someuniqueauthkey/'$1'\" authentication=\"someuniqueauthkey/' $configFile

2

要匹配数字,您可以使用[0-9]\{2}\d\{2}

在您的情况下,??也将仅匹配30

您可以在此处找到有关正则表达式的详细概述。


@Jarob22:是的,抱歉,我漏掉了反斜杠。 - ezdazuzena

1
首先,匹配表达式必须是30..而不是30??
然后,你似乎忘记了sed的-e参数。
尝试使用以下命令:
sed -e 's/30..\" authentication=\"someuniqueauthkey/'$1'\" authentication=\"someuniqueauthkey/' $configFile

其他答案没有-e,为什么你的需要它? - Jarob22

1

这可能对你有用:

sed 's/30[0-9][0-9]\(" authentication="someuniqueauthkey\)/'$1'\1/' $configFile

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接