Regex 将线右侧的点替换为下划线

Regex 将线右侧的点替换为下划线,regex,sed,Regex,Sed,假设我有这段文字: some.blah.key={{blah.woot.wiz}} some.another.foo.key={{foo.bar.qix.name}} + many other lines with a variable number of words separated by dots within {{ and }} 在右部分(在{和}分隔符之间)用下划线替换点后,我希望得到以下结果: 我正在寻找合适的正则表达式,以便在一行程序sed命令中执行替换 我在这一条上领先:但它捕

假设我有这段文字:

some.blah.key={{blah.woot.wiz}}
some.another.foo.key={{foo.bar.qix.name}}
+ many other lines with a variable number of words separated by dots within {{ and }}
在右部分(在
{
}
分隔符之间)用下划线替换点后,我希望得到以下结果:

我正在寻找合适的正则表达式,以便在一行程序
sed
命令中执行替换

我在这一条上领先:但它捕捉到了所有的点,包括我不想要的左边的点。
我尝试了这个变体来排除左边的部分,但是它不再捕获任何内容:

我提出了一个非常复杂的一行:

sed "h;s/=.*/=/;x;s/.*=//;s/\./_/g;H;x;s/\n//"
说明:

  • h
    :将行放入保持缓冲区
  • s/=.*/=
    :在
    =
  • x
    :交换以再次将行放入主缓冲区,第一部分放入保持缓冲区
  • s/*=/
    :在
    =
  • s/\./\ug
    :现在主缓冲区中只有正确的部分,执行点的替换
  • H
    :附加主缓冲区以保留缓冲区
  • x
    :再次交换缓冲区
  • s/\n/
    :删除换行符或两部分显示在单独的行中

这很有趣,但可能sed不是执行该操作的最佳工具,它属于

我提出了一个非常复杂的一行:

sed "h;s/=.*/=/;x;s/.*=//;s/\./_/g;H;x;s/\n//"
说明:

  • h
    :将行放入保持缓冲区
  • s/=.*/=
    :在
    =
  • x
    :交换以再次将行放入主缓冲区,第一部分放入保持缓冲区
  • s/*=/
    :在
    =
  • s/\./\ug
    :现在主缓冲区中只有正确的部分,执行点的替换
  • H
    :附加主缓冲区以保留缓冲区
  • x
    :再次交换缓冲区
  • s/\n/
    :删除换行符或两部分显示在单独的行中
这很有趣,但可能sed不是执行该操作的最佳工具,它属于

您可以使用循环:

sed ':a;s/\({{[^}]*\)\./\1_/;ta' file
:a
定义标签“a”
ta
在替换某物时跳转到“a”。

您可以使用循环:

sed ':a;s/\({{[^}]*\)\./\1_/;ta' file
:a
定义标签“a”

ta
当某件东西被替换时跳到“a”。

这是一个非常聪明的解决方案。@Cyrus:谢谢,我玩了它,把它简化了一点。用GNU sed替换
=
sed-r]右侧的:a;s/(=.*)\./\1;ta'文件
=
左侧:
sed-r:a;s/\.(.*=)/\u1/;ta'文件
谢谢,它做得很好。我很好奇,如果在Java中使用一个正则表达式,而不使用sed附加语义(此处循环),是否可以做到这一点?@GillesPhilippart:是的,您可以使用
\G
锚来实现。pcre:或java:一个非常聪明的解决方案。@Cyrus:谢谢,我玩过它,并把它简化了一点。用GNU sed替换
=
sed-r]右侧的:a;s/(=.*)\./\1;ta'文件
=
左侧:
sed-r:a;s/\.(.*=)/\u1/;ta'文件
谢谢,它做得很好。我很好奇,如果在Java中使用一个正则表达式,而不使用sed附加语义(此处循环),是否可以做到这一点?@GillesPhilippart:是的,您可以使用
\G
锚来实现。pcre:或java:您的分隔符是
{{
}
,因此我假设您的文本中可以有单个
{
}
字符,例如
some.blah.key={{abc{def}ghi}
,对吗?您应该将其包含在示例输入/输出中,否则您将得到失败的解决方案。您的分隔符是
{
}
,因此我假设您可以在文本中包含单个
{
}
字符,例如
some.blah.key={{abc{def}ghi}
,对吗?您应该将其包含在示例输入/输出中,否则您将得到失败的解决方案。