Regex 带条件替换的正则表达式

Regex 带条件替换的正则表达式,regex,awk,sed,Regex,Awk,Sed,我试图编写一个正则表达式来替换字符串中的一个字符,前提是满足一个条件。特别是,如果字符串以y结尾,我想将a的所有实例替换为o,并删除最后的y。为了举例说明我试图做什么: Katy --> Kot cat --> cat Kakaty --> KoKot avidly --> ovidl 我使用的是RegExs/\(\w*\)a\(\w*\)y$/\1o\2/g,但它不起作用。我想知道如何用正则表达式捕捉这个任务的“条件”性质 非常感谢您的帮助。您可以使

我试图编写一个正则表达式来替换字符串中的一个字符,前提是满足一个条件。特别是,如果字符串以
y
结尾,我想将
a
的所有实例替换为
o
,并删除最后的
y
。为了举例说明我试图做什么:

Katy    --> Kot
cat     --> cat
Kakaty  --> KoKot
avidly  --> ovidl
我使用的是RegEx
s/\(\w*\)a\(\w*\)y$/\1o\2/g
,但它不起作用。我想知道如何用正则表达式捕捉这个任务的“条件”性质


非常感谢您的帮助。

您可以使用
awk

输入:

cat file
awk '/y$/{gsub(/a/, "o"); sub(/.$/, "")} 1' file

命令:

cat file
awk '/y$/{gsub(/a/, "o"); sub(/.$/, "")} 1' file

使用GNU时:

如果一行以y结尾(
/y$/
),则将每个
a
替换为
o
,并将尾随的y替换为零(
s/y$/

输出:

Kot cat Kokot ovidl 科特 猫 科科特 奥维德 你可以使用一些sed意大利面代码,但请不要

sed '
    s/y$//     ; # try to replace trailing y
    ta         ; # if successful, goto a
    bb         ; # otherwise, goto b
    :a
    y/a/o/     ; # replace a with o
    :b
'

你必须使用sed吗?这是用于shell脚本的吗?是的,我正在尝试使用
sed
或一些shell等价物来替换它。我将添加一个示例。我还可以编写
”/y$/{s///;y/a/o/}
来重用过滤器正则表达式。@glennjackman:谢谢你的提示。如果我没看错的话,那么我必须插入一个带有GNU sed的分号:
/y$/{s//;y/a/o/;}
嗯,对。奇怪的是,
s/a/o/g
不需要分号。perl中的等价物没有任何改进:
perl-pe'/y$/和do{s//;y/a/o/}
当我试图用say
to
替换
a
时,这似乎不起作用。它是否只适用于长度相等的替换?
sed '
    s/y$//     ; # try to replace trailing y
    ta         ; # if successful, goto a
    bb         ; # otherwise, goto b
    :a
    y/a/o/     ; # replace a with o
    :b
'