sed에서 파일 이름 대신 역참조를 사용하는 방법은 무엇입니까?

sed에서 파일 이름 대신 역참조를 사용하는 방법은 무엇입니까?

sed파일을 스캔하여 패턴을 찾은 다음 일치하는 패턴의 일부를 파일 이름으로 사용하고 파일 내용을 해당 위치에 삽입하려고 합니다 . 대부분의 작업을 수행할 수 있지만 파일 이름 대신 역참조를 사용하는 방법을 알 수 없는 것 같습니다.

간단히 말해서, 라텍스 파일은 전처리되어야 하고 모든 최상위 \input명령은 제거되어야 합니다. 왜냐하면 이것은 lilypond-bookStupid™이기 때문입니다.

# 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 전용)를 사용하여 명령을 평가합니다.

관련 정보