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