sed
파일을 스캔하여 패턴을 찾은 다음 일치하는 패턴의 일부를 파일 이름으로 사용하고 해당 위치에 파일 내용을 삽입하는 데 사용하려고 합니다 . 대부분의 작업을 수행할 수 있지만 파일 이름 대신 역참조를 사용하는 방법을 알 수 없는 것 같습니다.
짧은 버전은 Stupid™이기 때문에 라텍스 파일을 사전 처리하고 모든 최상위 \input
명령을 제거해야 한다는 것입니다.lilypond-book
# Setup files for example
$ echo "foo\n\\input{file2}\nfoo" > file1
$ echo "bar\nbar" > file2
# Use sed to find and replace latex \input commands
$ sed $'/^\\\\input{\\(.*\\)}$/ {r file2\n d}' file1
foo
bar
bar
foo
지금까지는 괜찮았지만 하드 코딩된 파일 이름이 있으므로 위의 그룹 일치 결과( {
와 }
구분 기호 사이의 부분)를 파일 이름으로 사용해야 합니다. 불행히도 이것은 작동하지 않습니다.
$ sed $'/^\\\\input{\\(.*\\)}$/ {r \\1\n d}' file1
foo
foo
이와 같은 시나리오에서 일치하는 패턴을 파일 이름으로 어떻게 사용할 수 있습니까?
답변1
GNU를 사용하면 sed
다음과 같은 일을 할 수 있습니다:
sed '/^\\input{\(.*\)}$/{s//\1/;s/'\''/&\\&&/g;s/.*/cat<'"'&'/e}"
(즉, cat<'the-file'
명령을 작성하고(필요한 경우 파일 이름의 따옴표를 이스케이프 처리함) 명령 e
의 플래그 s
(GNU 관련)를 사용하여 해당 명령을 평가합니다.