sed가 잘못된 슬래시를 대체함

sed가 잘못된 슬래시를 대체함

LaTeX 파일에 다음 코드가 있습니다.

for \emph{service} in \emph{host}.resources:
    for \emph{file} in \emph{host}.resources:
        \underline{service}.requires.add(\underline{file})
    for \emph{package} in \emph{host}.resources:
        \underline{service}.requires.add(\underline{package})

이것은 목록 환경에 있고 여전히 emph 및 underline 명령이 필요하기 때문에 LaTeX 명령을 이스케이프했으며 결과는 다음과 같습니다.

for %*\emph{file}*) in %*\emph{host}*).resources:

다음 sed 명령을 사용하여 이 프로세스를 자동화하려고 합니다.

sed "s_\(\\emph{[a-z]*}\)_%\*\1\*)_"

그러나 이는 다음과 같은 출력을 생성합니다.

for \%*emph{dir}*) in \emph{host}.resources:

여기에는 두 가지 문제가 있습니다.

  1. emph 앞의 '\'는 LaTeX 이스케이프 문자 앞에 배치됩니다.
  2. sed는 첫 번째 일치만을 대체하는 것 같습니다. 나는 sed의 탐욕스러운 일치에 대해 알고 있으므로 중괄호 안에 .* 대신 [az]*를 사용합니다. 그러나 이것은 작동하지 않는 것 같습니다.

내가 원하는 작업을 수행하도록 sed를 얻는 방법에 대한 아이디어가 있습니까?

답변1

그것을 발견.

sed 명령에서는 큰따옴표가 사용되므로 sed와 bash 모두에 대해 슬래시를 이스케이프 처리해야 합니다. bash가 이스케이프를 무시하도록 작은따옴표를 변경하면 첫 번째 문제가 해결됩니다.

"g"를 추가하면(글로벌바꾸기)는 이제 라인의 모든 것과 일치합니다.

최종 결과:

sed 's_\(\\emph{[a-z]*}\)_%\*\1\*)_g' 

관련 정보