2012-03-15 1 views
1

폴더가 .tex 파일로 가득 찼습니다.이 파일 이름을 파일에 쓰고 싶습니다. 각각 동일한 래퍼 안에 있습니다.폴더에있는 모든 .tex 파일 이름을 파일에 쓰십시오. 각각 동일한 래퍼 내에 있습니다.

예를 들어, 파일 이름이 간단한 패턴을 따르지 않지만 A.tex, B.tex 및 C.tex라는 세 개의 .tex 파일이있는 폴더가 있다고 가정 해 봅시다. 이 .tex 파일은 테이블이고 나는 \begin{table} \input{A.tex} \end{table} 등을 얻기 위해이 파일을 감싸고 싶습니다.

내 첫 번째 생각은 LaTeX 솔루션이있을 수 있지만 TeX SE를 둘러 보니 Vim (특히 세 번째 대답 here)에서 처리하는 것이 더 나은 것으로 보입니다. 아니면 Perl이나 다른 스크립팅 언어로 처리하는 것이 더 나은가? (필자는 Perl에 대한 지식이 제한되어 있지만, 이것이 더 많은 것을 배우기 위해 동기를 부여 할 것이다). 감사!

+0

유닉스 계열 시스템을 사용하고 있습니까, 아니면 Windows에서이 작업을 수행해야합니까? – Kevin

+0

@Kevin - 로컬로 64 비트 Win 7에서 gVim을 사용하지만 원격 Linux 서버에서도 Vim을 사용합니다.이 서버는 .tex 파일을 생성합니다. 어느 솔루션이 나만큼 훌륭합니다. –

답변

2

줄 바꿈 문자를 포함하지 않는 파일 이름의 경우, 문제는 쉽게 빔 스크립트에서 해결 될 수 있습니다

:call append('.', map(split(glob('*.tex'), '\n'), '''\begin{table} \input{''.v:val.''} \end{table}''')) 

또는

:let fmt = '\begin{table} \input{%s} \end{table}' 
:call append('.', map(split(glob('*.tex'), '\n'), 'printf(fmt, v:val)')) 

명령은 위의 수집 glob() 함수를 사용하여 지정된 와일드 카드와 일치하는 파일 이름 목록 . 결과 파일 이름 집합은 줄 바꿈 문자로 구분 된 경로가 포함 된 문자열 으로 표시됩니다. split() 함수를 사용하면 문자열이 map() 함수에 의해 처리되어 원하는 텍스트 템플릿에 따라 파일 이름의 서식을 지정하는 목록으로 나뉩니다. 그런 다음이 목록의 문자열이 append() 기능이있는 현재 행 아래에 삽입됩니다.

버퍼에 파일 이름의 목록을 채우는 또 다른 방법은 :read! 명령을 통해 시스템 디렉토리 목록 명령의 출력 를 삽입하는 것입니다

,

필요에 따라 목록 형식을하기 위해
:r!ls *.tex 

을 실행
:'[,']s/.*/\\begin{table} \\input{&} \\end{table}/ 

이전 명령을 실행 한 직후.

+0

고마워요! 위대한 작품! –

+1

@richardh : 고마워요! 제발, 대답의 업데이 트를 한번보세요. 호스트 시스템 명령과의 상호 작용을 기반으로 문제를 해결하는 또 다른 방법에 대한 설명을 추가했습니다. –

+0

와우. 나는 두 번째 옵션을 선호한다. 그것은 나에게 조금 더 투명하다 (그리고 나에게 다른 새로운 기술을 가르친다). 감사! –

1

vim 스크립팅이이를 처리 할 수 ​​있지만 Bash에서는 훨씬 쉽게 처리 할 수 ​​있습니다.

for file in *.tex; do 
    echo "\\begin{table} \\input{$file} \\end{table}" >> tables.Tex 
done 

이제 파일 이름 중 Tex에 대해 이스케이프해야하는 문자가 없다고 가정합니다. 그들이하는 경우 vim (:%s/find/repl/g) 또는 셸 교체 (${file//find/repl})를 사용하여 수행 할 수 있습니다.

관련 문제