그래서 다른 파일이 포함된 소스 파일에서 출력 파일을 만들려고 합니다.
(내 사용 사례는 실제로 Kubernetes/OpenShift용 YAML이지만 이 .txt 파일은 목표를 보여줍니다.)
예를 들어:
% cat source.txt
This is the source files it will include two other files.
The first will be here:
#INCLUDE ./first-included-file.txt
And the second file will be inserted here:
#INCLUDE ./second-included-file.txt
And this is the end of source.txt
포함된 파일이 다음과 같은 경우:
% cat first-included-file.txt
This is FIRST
End of FIRST
% cat second-included-file.txt
This is SECOND
End of SECOND
그러면 출력은 다음과 같습니다.
This is the source files it will include two other files.
The first will be here:
This is FIRST
End of FIRST
And the second file will be inserted here:
This is SECOND
End of SECOND
And this is the end of source.txt
다른 답변 사용
sed '/#INCLUDE/ r insertfile'
그러나 소스의 값에서 파일 이름을 찾는 일반적인 솔루션이 있습니까?
각 줄을 읽고 구문 분석하는 Bash 스크립트가 작업을 수행할 수 있을 것 같지만 아마도 awk
다른 것이 이 작업을 수행할 수 있을까요?
답변1
프로그램 파일- C 전처리기 명령을 사용할 수 있습니다. 이 명령은 일반적으로 대부분의 Linux 배포판 gcc
이나 소프트웨어 패키지에 포함되어 있습니다.cpp
C 전처리기라고 부르지만 다른 파일에도 사용할 수 있고, 등 의 표준 C 전처리기 지시문을 사용할 수 있습니다 #include
.#define
#ifdef
예를 들어:
소스파일.txt
This is the source files it will include two other files.
The first will be here:
#include "first-included-file.txt"
And the second file will be inserted here:
#include "second-included-file.txt"
And this is the end of source.txt
첫 번째 포함 file.txt
This is FIRST
End of FIRST
두 번째 포함 file.txt
This is SECOND
End of SECOND
산출cpp -P source.txt
$ cpp -P source.txt
This is the source files it will include two other files.
The first will be here:
This is FIRST
End of FIRST
And the second file will be inserted here:
This is SECOND
End of SECOND
And this is the end of source.txt
노트:
- 이
-P
플래그는 전처리기의 출력에서 라인 마커 생성을 억제합니다. - 매뉴얼 페이지
- "#include, #define, #ifdef 등과 같은 표준 C 전처리기 지시문을 사용할 수 있습니다." - 그러나 이를 원하지 않고 파일을 있는 그대로 포함하려는 경우 각 #INCLUDE를 #include로 변환하고 포함된 파일 이름을 인용하는 것 외에도 문자를 비활성화하는 작업을 수행해야 합니다. cpp를 실행하기 직전에 #include, #define, #ifdef 등의 문자열이 입력에 나타날 수 있습니다. 그렇지 않으면 이러한 문자열의 발생에 따라 텍스트에 불필요한 변환이 수행됩니다.
- 포함할 파일이 로컬 디렉터리에 없는 경우(cpp 구현이 일반적으로 로컬 디렉터리를 먼저 검색한다고 가정할 때) 예기치 않은 결과가 나타날 수도 있지만 cpp는 다음 중 하나에서 동일한 이름을 가진 파일을 찾을 수 있습니다. 다음 디렉터리: it 파일이 포함된 다른 구현 정의 디렉터리를 검색합니다.
답변2
"d) 입력 파일의 재귀 하강 구문 분석을 조정합니다. 예:"http://awk.freeshell.org/AllAboutGetline#INCLUDE
include
파일 이름에 개행이 아닌 공백이 포함되어 있어도 awk를 사용하여 다음을 수행할 수 있습니다.
awk '
function read(file) {
while ( (getline < file) > 0) {
if ( sub(/^#INCLUDE[ \t]+/,"") ) {
read($0)
} else {
print
}
}
close(file)
}
BEGIN {
read(ARGV[1])
}
' source.txt
This is the source files it will include two other files.
The first will be here:
This is FIRST
End of FIRST
And the second file will be inserted here:
This is SECOND
End of SECOND
And this is the end of source.txt
위의 내용은 재귀 포함이 없다고 가정합니다. 그렇다면 원하는 재귀 의미를 달성하는 데 필요한 모든 논리를 추가하세요.
답변3
사용행복하다(이전 Perl_6)
heredocs
:to
Perl과 Raku 모두 원하는 출력을 제공할 수 있는 인용 구성(예: "doc here" 인용)을 가지고 있습니다 .
소스파일.txt
my $file1 = '/path/to/first-included-file.txt'.IO.lines.join("\n");
my $file2 = '/path/to/second-included-file.txt'.IO.lines.join("\n");
my $pre-processed = qs:to/TERMINATOR/;
This is the source files it will include two other files.
The first will be here:
$file1
And the second file will be inserted here:
$file2
And this is the end of source.txt
TERMINATOR
put $pre-processed;
첫 번째 포함 file.txt
This is FIRST
End of FIRST
두 번째 포함 file.txt
This is SECOND
End of SECOND
산출raku source.txt
This is the source files it will include two other files.
The first will be here:
This is FIRST
End of FIRST
And the second file will be inserted here:
This is SECOND
End of SECOND
And this is the end of source.txt
Raku lingo에서 "Q-lang"(또는 속어)으로 알려진 이 인용 언어만 사용하기 위해 전체 Raku 언어를 배울 필요는 없습니다. 위에서는 최소보간법을 code를 이용하여 호출하였습니다 qs:to/TERMINATOR/;
. 여기에서는 qs
Raku에게 "스칼라" 또는 $
-부호화된 변수만 삽입하도록 지시합니다( qq
이를 사용하면 모든 Raku 변수가 삽입됩니다). 기타 (중간) 보간 옵션은 아래에서 확인할 수 있습니다.
https://docs.raku.org/syntax/heredocs%20%3Ato
https://docs.raku.org/언어/quoting
https://stackoverflow.com/a/76624379/7270649
https://raku.org
답변4
"m4" 매크로("m"으로 시작하고 뒤에 4개의 문자가 오는 이름) 프로그램은 포함 작업을 수행합니다. 그러나 포함 형식은 "include (`file')"입니다. "정보 m4"를 참조하십시오.