你想要原始的?这个 sed 脚本应该可以在 V7 之后的所有 UNIX 上运行(但我还没有在任何真正古老的东西上测试过它,所以要小心)。运行它sed -n -f scriptfile infile > outfile
: loop
/^class [A-Za-z0-9_][A-Za-z0-9_]*(\([A-Za-z0-9_][A-Za-z0-9_]*, *\)*[A-Za-z0-9_][A-Za-z0-9_]*):$/{
h
s/^class \([A-Za-z0-9_][A-Za-z0-9_]*\)(\([A-Za-z0-9_][A-Za-z0-9_]*\)[,)].*/\2 -> \1;/
p
g
s/\(class [A-Za-z0-9_][A-Za-z0-9_]*(\)[A-Za-z0-9_][A-Za-z0-9_]*,* */\1/
b loop
}
这些是 BRE(基本正则表达式)。它们没有+
运算符(仅在扩展正则表达式中找到),而且绝对没有\w
(由 perl 发明)。所以你的简单\w+
变成[A-Za-z0-9_][A-Za-z0-9_]*
了我不得不多次使用它,导致严重的丑陋。
以伪代码形式,它的作用是:
while the line matches /^class \w+(comma-separated-list-of \w+):$/ {
save the line in the hold space
capture the outer \w and the first \w in the parentheses
replace the entire line with the new string "\2 -> \1;" using the captures
print the line
retrieve the line from the hold space
delete the first member of the comma-separated list
}