문자열 바꾸기에서 찾은 문자열 부분을 사용하여 찾기 및 바꾸기

문자열 바꾸기에서 찾은 문자열 부분을 사용하여 찾기 및 바꾸기

임의의 문자열 로 설정합니다 foo. 파일에서 다음 항목이 모두 검색되어야 합니다.

   \LeftLabel{foo}

각 항목을 다음으로 대체합니다.

   \LeftLabel{\textsf{foo}}

$그러나 foo가 문자로 시작 하지 않는 경우에만 해당됩니다 . 어떻게?

답변1

이 테스트 파일을 고려해 보겠습니다.

$ cat file
\LeftLabel{foo}
\LeftLabel{$foo}
LeftLabel{foo}

이제 대체를 해보겠습니다.

$ sed -E 's|\\LeftLabel\{([^$}][^}]*)\}|\\LeftLabel{\\textsf{\1}}|g' file
\LeftLabel{\textsf{foo}}
\LeftLabel{$foo}
LeftLabel{foo}

어떻게 작동하나요?

의 바꾸기 명령은 where 가 정규식이고 그 자리에서 대체되는 것처럼 sed보이며 , 끝에 있는 명령은 sed에게 첫 번째 줄뿐만 아니라 줄에서 이 항목을 모두 바꾸라고 지시합니다.s|old|new|goldnewg

우리 명령에서 해당 old부분은 다음과 같습니다.

\\LeftLabel\{([^$}][^}]*)\}

이는 or 를 \LeftLabel{제외한 모든 문자가 뒤따르는 모든 문자와 일치합니다 . 즉, 그 뒤에 임의 개수의 not 이 옵니다 . 즉 뒤에 a 가 옵니다 . 이러한 문자 중 일부는 sed가 정규 표현식 활성 문자가 아닌 일반 문자로 처리하도록 백슬래시가 앞에 있어야 합니다. 또한 중괄호 안의 문자는 괄호 안에 표시됩니다. 대괄호는 정규식 활성 문자로, sed에게 내용을 그룹 1로 저장하라고 지시합니다. 명령 섹션에서 이러한 문자를 인용 할 수 있습니다 .$}[^$}]}[^}]*}\1new

관련 정보