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

관련 정보