防止 sed 打印空内容

防止 sed 打印空内容
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

相关内容