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