我正在使用内置正则表达式实现的软件,它不支持全局修饰符,所以我必须让它在没有/ g的情况下工作
我的测试字符串是(部分的数量可以是无限的:
AAA%2dbbb%2dccc%2dddd%2deee
我希望它是:aaa-bbb-ccc-ddd-eee
通常我会写(%2d)和g标志并用 -
替换我设法写这个以匹配无限次出现次数
(\ w)的((%2D)(\ W +))+
但我有替换规则的问题,因为我的组2有2个子组,我找不到如何处理它们,
任何人都可以帮助替换规则吗?
答案 0 :(得分:0)
由于评论最终得出了我在发布问题之前得出的相同结论,我决定发布答案以便很好地结束问题(而不是删除问题,因为即使是否定答案也是答案,可能会节省一个小时或更长时间的研究(实际发生在我身上))。一般的结论是 - 用正则表达式来解决这个问题是不可能的。我在这里引用@ltux的两条最佳评论:
一次性使用正则表达式无法解决此问题。如果捕获组与+等量词一起使用,则捕获组的内容将始终是找到的最后一个匹配。在您的情况下,第二个捕获组的内容将为%2deee,您无法获得%2dbbb,%2dccc等,因此您有机会替换它。 - ltux 2天前
正则表达式无法解决您的问题。您必须自己试图绕过软件的限制,除非您告诉我们您正在使用哪种软件。 - ltux 2天前
答案 1 :(得分:0)
创建一个包含您要处理的行类型的文件:
cat << EOF >> abcde.txt
aaa%2dbbb%2dccc%2dddd%2deee
EOF
使用您提到的全局替换作为您通常执行此类替换的方式,使用此sed片段如下所示。
sed -e "s#%2d#-#g" abcde.txt
aaa-bbb-ccc-ddd-eee
基本上,您不必考虑在空白字符周围出现的字符类型,而只关注白色空间本身。多次更换此字符将非常简单地解决您的问题。换句话说,不需要围绕与改变有关的角色进行模式匹配。这是我们许多人在处理正则表达式时遇到的常见问题。
基本上替换是这样的:找到第一个出现的空格'%2d',用连字符' - '替换它,并重复其余的字符串。