【问题标题】:Using sed to find and replace a range of numbers使用 sed 查找和替换一系列数字
【发布时间】:2012-02-13 02:33:45
【问题描述】:

这里是第一张海报。

尝试使用 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 和 authkeys 被清除)。

【问题讨论】:

  • 您能否将您的代码剥离到与 sed 直接相关的部分?您能否发布您的输入文件的某些部分?
  • 30 是多少?应该是什么意思你想和这个搭配什么?你为什么要在' 里面逃避"
  • 30??应该是 30,然后是任何 2 个字符。
  • 我在 ' 中转义 " 因为 " 是字符串的一部分。

标签: regex bash sed sh


【解决方案1】:

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

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

你可以找到一个很好的正则表达式概述here

【讨论】:

  • @Jarob22:jep,对不起,错过了反斜杠。
【解决方案2】:

这可能对你有用:

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

【讨论】:

    【解决方案3】:

    首先,匹配的表达式必须是30.. 而不是30??
    然后,您似乎忘记了 sed 的 -e 参数。
    尝试:

    sed -e 's/30..\" authentication=\"someuniqueauthkey/'$1'\" authentication=\"someuniqueauthkey/' $configFile
    

    【讨论】:

    • 其他答案没有-e,你的为什么需要?
    【解决方案4】:

    使用[0-9] 而不是? 来匹配单个数字。

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

    【讨论】:

      猜你喜欢
      • 2020-08-05
      • 2017-01-07
      • 2013-03-23
      • 2021-10-06
      • 1970-01-01
      • 2011-09-04
      • 2019-11-29
      • 2018-10-01
      相关资源
      最近更新 更多