sed에서 파일 이름 대신 역참조를 어떻게 사용할 수 있나요?

sed에서 파일 이름 대신 역참조를 어떻게 사용할 수 있나요?

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 관련)를 사용하여 해당 명령을 평가합니다.

관련 정보