다음과 같은 "include" 문으로 시작하는 파일이 있습니다.
include foo.xyz
include bar.xyz
do c
do d
파일 foo.xyz
에 가 포함되어 do a
있고 파일에 가 bar.xyz
포함되어 있다고 가정합니다. 각 문을 의 컨텍스트로 바꾸는 do b
스크립트를 어떻게 작성할 수 있습니까 ? 나는 다음과 같은 결과를 얻고 싶습니다.include file.xyz
file.xyz
do a
do b
do c
do d
나는 노력했다 "sed를 사용하여 문자열을 파일 내용으로 대체"하지만 파일 이름은 하드코딩되어 있습니다. 매개변수에 따라 파일 이름이 동적으로 생성되기를 원합니다 include
.
답변1
이것은 awk를 사용한 간단한 재귀 버전입니다. PATH에 스크립트를 생성해야 합니다.
#!/bin/bash
awk '
$1=="include" && NF>=2 {
system("'$0' " $2)
next
}
{print}' "$@"
파일 이름에 특수 문자(공백 포함)가 없다고 가정합니다. awk는 첫 번째 단어가 포함되어 있는지 확인한 다음 스크립트를 호출하여 두 번째 단어로 제공된 파일을 처리합니다. 추가 줄을 인쇄합니다. 참고 $0
로 여기는외부awk의 경우 작은따옴표, shell의 경우에도 동일합니다 $0
. 즉, 스크립트 이름입니다.
답변2
grep -n '^include ' yourfile |
sed -e 's/:[^ ]* /{ r /' \
-e 'G;s/.$/&b&}/' |
sed -nf - -ep yourfile
그러면 효과가 있을 것입니다. grep
그거 찾아봐포함하다첫 번째는 라인 번호에 특정한 명령 sed
으로 출력을 수정하고 , 두 번째는 첫 번째 스크립트 중 하나가 아닌 모든 라인을 인쇄합니다.[num]{r fname\nb\n}
sed
p
{ for x in a b
do echo "do $x">"file$x.xyz"
echo "include file$x.xyz"
done; printf "do %s\n" c d
} >yourfile
cat yourfile
include filea.xyz
include fileb.xyz
do c
do d
그러면 샘플이 생성되어 표시됩니다.당신의 프로필.
이것은 작동합니다:
grep -n '^include ' yourfile |
sed -e 's/:[^ ]* /{ r /' \
-e 'G;s/.$/&b&}/' |
sed -nf - -ep yourfile
do a
do b
do c
do d
물론 ead r
파일의 크기는 제한되지 않으며 한 줄로 제한되지 않습니다. 파일 이름 자체는 한 줄로 제한되어 있지만 그 외에는 다소 제한이 없습니다.(사용자에 따라 다릅니다 sed
. 일부 오래된 이름에는 seds
임의의 이름 길이 제한이 있지만 오늘날 사용되는 대부분은 그렇지 않습니다.).
답변3
cat $(grep '^include' file.txt | cut -d" " -f2); grep -v '^include' file.txt
첫 번째 명령은 grep
in으로 시작하는 줄, 파일 이름 부분, 그리고 그 줄을 사용합니다.include
file.txt
cut
cat
다음 명령은 include
in으로 시작하는 줄을 제외한 모든 줄을 인쇄합니다.file.txt