2013-10-05 4 views
2

wikitext를 라텍스 코드로 변환하는 데 sed를 사용하려고합니다. 나는 거의 다 있어요,하지만 난이 같은 수치의 라벨의 생성을 자동화하고 싶습니다 : 내가 나오지도 계속 사용하고 싶은 것을 들어Sed 동적 역 참조 대체

\includegraphics{mypicture.png}\label{img-1} 

:에 ...

[[Image(mypicture.png)]] 

을 . 현재 사용중인 정규 표현식과 bash 코드는 다음과 같습니다.

__tex_includegraphics="\\\\includegraphics[width=0.95\\\\textwidth]{$__images_dir\/" 
__tex_figure_pre="\\\\begin{figure}[H]\\\\centering$__tex_includegraphics" 
__tex_figure_post="}\\\\label{img-$__images_counter}\\\\end{figure}" 

sed -e "s/\[\[Image(\([^)]*\))\]\].*/$__tex_figure_pre\1$__tex_figure_post/g"\ 

...하지만이 카운터를 늘릴 수는 없습니다. 어떤 아이디어?

더 일반적인 관점에서 내 질문은 다음과 같을 것입니다 : sed의 매치마다 다른 대체물을 만들기 위해 sed에서 역 참조를 사용할 수 있습니까? 이것은 sed가 패턴과 매번 일치 할 때마다 \ 1을 함수의 입력으로 사용할 수 있으며이 함수의 결과를 대체 할 수 있습니까?

저는 까다로운 질문이므로 AWK를 사용해야 할 수도 있습니다. 그러나 누군가가 해결책을 가지고 있다면, 나는 그 사람의 도움에 감사 할 것입니다.

+0

라텍스 카운터가 포함 된 정적 라텍스 코드를 출력하고 레이블의 해당 카운터 값을 사용하도록 선택했을 것입니다. 이렇게하면 나중에 라텍스를 관리하기가 더 쉬워집니다. – Caleb

답변

2

당신 (GNU이 나오지도)에 대한이 작동 될 수 있습니다

sed -r ':a;/'"$PATTERN"'/{x;/./s/.*/echo $((&+1))/e;/./!s/^/1/;x;G;s/'"$PATTERN"'(.*)\n(.*)/'"$PRE"'\2'"$POST"'\1/;ba}' file 

이 쉘 변수에 포함 된 패턴을 찾습니다 아니라면 선물은 현재 행을 인쇄합니다. 패턴이 존재하면 홀드 공간에서 카운터를 증가 시키거나 준비한 다음 상기 카운터를 현재 라인에 추가합니다. 그런 다음 쉘 변수 PRE와 POST 및 카운터를 사용하여 패턴을 대체합니다. 마지막으로 패턴의 추후 사례에 대해 현재 라인이 검사되고 필요한 경우 절차가 반복됩니다.

+0

확실히 그것이 예상했던 것보다 더 복잡했습니다. 도와 주셔서 감사합니다. – Ricardo

2

셸 기능을 사용하여 파일을 한 줄씩 읽고 각 줄마다 별도의 sed 명령을 사용할 수 있습니다.

exec 0<input_file 

while read line; do 
    echo $line | sed -e "s/\[\[Image(\([^)]*\))\]\].*/$__tex_figure_pre\1$__tex_figure_post/g" 
    __images_counter=$(expr $__images_counter + 1) 
done 

같은 뭔가 (한 줄에 여러 일치가있는 경우에, 그래도 작동하지 않습니다.)

두 번째 부분에 대한 내 최고의 아이디어는 sed 또는 grep가되고있는 것을 찾기 위해 실행하는 것입니다 일치 한 다음 명령으로 대체 된 일치하는 텍스트의 기능 값으로 다시 sed을 실행하십시오.

+1

'read line'은 백 슬래시가있는 줄을 수정합니다. 'read -r'을 사용하십시오. 'IFS = read line'은 줄 끝에서 공백을 없애지 않습니다. 'echo $ line'은 선행 공백을 제거하고 다른 모든 공백을 단일 공백으로 변경하며 일부 줄에는 느슨한'*'이 있으면 정말 불쾌한 일을합니다. 'echo "$ line"을 사용하십시오. 그 외에는 나쁜 조언이 아니지만 실제로 sed 나 bash는이 직업에 적합한 도구는 아닙니다. – rici

+0

오케이 ... 결국, sed는 내가 원하는 것을 기본적으로 지원하지 않습니다. 귀하의 솔루션에 감사드립니다. – Ricardo