sed는 한 줄을 다음 줄의 일부로 바꿉니다.

sed는 한 줄을 다음 줄의 일부로 바꿉니다.

다음과 같은 입력이 있습니다.

*123456789
This is a <secret>
Other stuff here.
*987654321
This is a <secret>
Other stuff here.

그 중에는 "여기에는 또 다른 것이 있습니다"가 있습니다. 한 줄이 더 있을 수 있지만 * 접두사가 붙은 숫자는 가변적이지만 항상 전체 줄을 차지하며 항상 일치할 수 있는 고정 텍스트 문자열인 "<secret>" 앞 줄에 나타납니다. 에게.

나는 이것을 쉘 스크립트의 한 줄 명령으로 파이프하여 "*123456789" 문자열이 다음 줄의 <secret> 항목을 대체하여 출력이 다음과 같도록 할 수 있기를 원합니다.

This is a *123456789
Other stuff here.
This is a *987654321
Other stuff here.

저는 sed의 여러 줄 처리를 이해하는 데 어려움을 겪고 있으며 다른 깔끔한 도구를 사용하는 데 열려 있습니다.

답변1

sed를 사용하면 를 사용하여 다음 줄을 가져온 N다음 를 사용하여 섹션을 다시 정렬할 수 있습니다 s. 예를 들어:

$ sed -E '/^\*[0-9]{1,}$/{N;s/(.*)\n(.*)<secret>/\2\1/}' file
This is a *123456789
Other stuff here.
This is a *987654321
Other stuff here.

답변2

$ awk '/^\*/ {secret=$0;next}; {gsub(/<secret>/,secret,$0); print}' input.txt 
This is a *123456789
Other stuff here.
This is a *987654321
Other stuff here.

*"비밀"에서 선행 부분을 제거하려면 awk의 substr()기능을 사용할 수 있습니다.

$ awk '/^\*/ {secret=substr($0,2);next}; {gsub(/<secret>/,secret,$0); print}' input.txt 
This is a 123456789
Other stuff here.
This is a 987654321
Other stuff here.

관련 정보