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:
여기에는 두 가지 문제가 있습니다.
- emph 앞의 '\'는 LaTeX 이스케이프 문자 앞에 배치됩니다.
- sed는 첫 번째 일치만을 대체하는 것 같습니다. 나는 sed의 탐욕스러운 일치에 대해 알고 있으므로 중괄호 안에 .* 대신 [az]*를 사용합니다. 그러나 이것은 작동하지 않는 것 같습니다.
내가 원하는 작업을 수행하도록 sed를 얻는 방법에 대한 아이디어가 있습니까?
답변1
그것을 발견.
sed 명령에서는 큰따옴표가 사용되므로 sed와 bash 모두에 대해 슬래시를 이스케이프 처리해야 합니다. bash가 이스케이프를 무시하도록 작은따옴표를 변경하면 첫 번째 문제가 해결됩니다.
"g"를 추가하면(글로벌바꾸기)는 이제 라인의 모든 것과 일치합니다.
최종 결과:
sed 's_\(\\emph{[a-z]*}\)_%\*\1\*)_g'