sed -e 's/\([A-Za-z]*\)\( \)\([A-Za-z]*\)\(:\?\)\([A-Za-z]*\)\?\( \)\?\(.*\)\?/[\1][\2][\3][\4][\5][\6][\7]/'
会装饰
class VoxelbuilderAdda:public VoxelBuilder
所以看起来像
[class][ ][VoxelbuilderAdda][:][public][ ][VoxelBuilder]
如果我有
class VoxelBuilder
输出是
[class][ ][VoxelBuilder][][][][]
是否可以阻止它打印空括号?
目标是用 like 打印所有标识符(方括号是我的简单占位符,但我应该将它们排除在关键字之外)
\textclassname{VoxelBuilder}
并保留关键字(类、结构、公共……)和分隔符(如“:”)。
显然,关键字+分隔符的倒置模式更有益,但我无法弄清楚。我其实想要
仅当 X 不是以下之一时,才将序列 X 替换为 \textclassname{X}
class
struct
union
public
private
protected
virtual
:
,
<
>
我在前面的步骤中去掉了大括号和分号。目标是
class \textclassname{VoxelbuilderAdda}:public \textclassname{VoxelBuilder}
没有继承权
class \textclassname{VoxelbuilderAdda}
如果我有可用的 not 运算符,它不仅会涵盖我拥有的那些,还会涵盖任何奇怪的多重继承。
答案1
所以你必须分别处理空格、单词和冒号:
sed -e 's/[A-Za-z]\{1,\}/[&]/g' -e 's/:/[&]/g' -e 's/ /[&]/g'
这将替换 a) 出现一个或多个具有方括号包围\{1,\}
模式的任何字母,b 和 c) 替换由方括号包围的单个冒号(空格)&
echo class VoxelbuilderAdda:public VoxelBuilder | sed -e 's/[A-Za-z]\{1,\}/[&]/g' -e 's/:/[&]/g' -e 's/ /[&]/g'
[class][ ][VoxelbuilderAdda][:][public][ ][VoxelBuilder]
答案2
对于这种类型的转换,最好使用特殊的解析工具,但如果您想像文本一样操作文件,请尝试:
sed 's/\(::\|[<, ]\)\(\w\+\)/\1\\textclassname{\2}/g' filename
或使用 -r 选项来避免额外转义:
sed -r 's/(::|[<, ])(\w+)/\1\\textclassname{\2}/g' filename