텍스트 블록을 파일 내용으로 바꾸기

텍스트 블록을 파일 내용으로 바꾸기

텍스트 파일 f1의 $Elements$와 $EndElements$ 사이의 내용을 다른 파일 f2의 데이터로 바꾸고 싶습니다.

f1의 내용은 간단히 다음과 같이 주어진다.

$Elements$
3
1
5
7
$EndElements$

f2의 내용은 다음과 같습니다

1 65 71
2 32 87
3 39 98
4 41 63

내가 생각해 낸 마지막 것은 다음과 같습니다.

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

이를 위해 stackexchange 페이지에서 일부 sed 코드를 시도했습니다. (코드를 복사했는데 더 이상 창이 열려 있지 않아 직접 링크를 제공할 수 없습니다. 죄송합니다.)

lead='^\$Elements\$$' 
tail='^\$EndElements\$$'
# f2 is the file where the information
# to replace is kept in 
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
    >         }; /$tail/p; d }"  f2

이것은 작동하지 않습니다. 기본적으로 아무것도하지 않습니다.

답변1

그리고 ed(1):

echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1

상세히:

  • /\$Elements\$/+1,/\$EndElements\$/-1$Elements$와 사이의 일치 선$EndElements$
  • d해당 줄 삭제
  • .-1이제 위의 줄$EndElements$
  • r f2파일 읽기f2
  • w결과를 작성하십시오.

답변2

sed -e "
   /$lead/,/$tail/!b
   //!d
   /$lead/r f2
" f1

결과

$Elements$
1 65 71
2 32 87
3 39 98
4 41 63
$EndElements$

피복재

  1. 먼저 ,쉼표 연산자를 사용하여 적절한 범위를 선택합니다.
  2. b이 범위 내에 없는 모든 행은 해당 행의 sed 코드 끝으로 제어를 분기하는 명령을 통해 있는 그대로 인쇄됩니다 .
  3. //!d범위 본문을 사용자 정의 파일 f2로 바꾸려고 하므로 범위 본문이 삭제됩니다 .
  4. 선행 라인이 나타나면 사용자 정의 파일 f2의 내용을 인쇄 대기열로 읽어옵니다(이는 패턴 공간과 동일하지 않습니다).
  5. 제어가 sed 코드의 끝에 도달하면 패턴 공간의 내용(리더 라인을 stdout으로 비워둠)과 이 이벤트 이후 대기열의 내용이 stdout으로 비워집니다.

관련 정보