파일 콘텐츠 찾기 및 바꾸기

파일 콘텐츠 찾기 및 바꾸기

다음과 같은 "include" 문으로 시작하는 파일이 있습니다.

include foo.xyz
include bar.xyz
do c
do d

파일 foo.xyz에 가 포함되어 do a있고 파일에 가 bar.xyz포함되어 있다고 가정합니다. 각 문을 의 컨텍스트로 바꾸는 do b스크립트를 어떻게 작성할 수 있습니까 ? 나는 다음과 같은 결과를 얻고 싶습니다.include file.xyzfile.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

첫 번째 명령은 grepin으로 시작하는 줄, 파일 이름 부분, 그리고 그 줄을 사용합니다.includefile.txtcutcat

다음 명령은 includein으로 시작하는 줄을 제외한 모든 줄을 인쇄합니다.file.txt

관련 정보