如何使用 sed 或其他工具修改正则表达式的匹配项?

如何使用 sed 或其他工具修改正则表达式的匹配项?

我需要操作文件中的文本。我需要)在前面有逗号的每个数字后面附加一个右括号 – ,– 例如,

  • ,4   ➜,4)
  • ,15,15)

我正在努力寻找正确的方法来做到这一点sed。我尝试了以下方法,它适用于 1 位数字,但似乎无法扩展到 2 位数字(因此上面第一行没问题,但第二行不行):

sudo sed 's/,\([0-9]\)/,\1)/g'文件名

然后我尝试了以下 2 位数字:

sudo sed 's/,\([0-9]([0-9]?\)/,\1)/g'文件名

这没有做任何事情 - 文件保持不变,尽管我没有收到错误消息。搜索一个必需数字和第二个可选数字然后将它们移动到替换文本中的正确方法是什么?我仍然需要完成这个:

  • ,15,15)

任何建议将不胜感激。

答案1

你就快到了,试试这个:

sudo sed 's/,\([0-9]\{1,2\}\)/,\1\)/g' filename

除了您的命令之外,我刚刚添加了与\{1,2\}之前的正则表达式匹配一到两次的命令,即从最少一次到最多两次。

\([0-9]\{1,2\}\)解释:

  • [0-9]将匹配 0 到 9 之间的单个数字
  • {1,2}将匹配之前的正则表达式一次到最多两次。因此,一场比赛是必须的,第二场比赛是可选的(如你所愿)
  • ()将创建一个正则表达式组,以便我们稍后可以引用它。
  • 另请注意,我们在所有扩展正则表达式语法前面使用了“\”,这样它们就不会按字面意思处理。我们可以将-r开关(扩展正则表达式)与 gnu 一起使用sed,在这种情况下我们可以编写:

    sudo sed -r 's/,([0-9]{1,2})/,\1\)/g' filename
    

编辑:如果您想在逗号后匹配任意数量的数字(最少一位),您可以执行以下操作:

sudo sed 's/,\([0-9]\{1,\}\)/,\1\)/g' filename

或者更简单地说:

sudo sed 's/,\([0-9]\+\)/,\1\)/g' filename

相关内容