sed: X 줄을 잘라서 파일 맨 위에 추가

sed: X 줄을 잘라서 파일 맨 위에 추가

X 선을 자르고 y 위치(상단)에 X 선을 삽입할 수 있기를 원합니다. 이렇게 하면 일부 구성 파일을 재구성하는 데 도움이 됩니다.

Text example line number 1 <--- Append line 10 above line 1
Text example line number 2
Text example line number 3
Text example line number 4
Text example line number 5
Text example line number 6
Text example line number 7
Text example line number 8
Text example line number 9
Text example line number 10 <--- Cut or hold in buffer
Text example line number 11
Text example line number 12
Text example line number 13

지금까지 내가 찾은 유일한 것은 다음과 같습니다.

# Cuts line 10 and adds it to the end of file    
sed -n -e '10h;10!p;${g;p;}' file-01.txt

하지만 예약된 내용을 마지막 줄이 아닌 다른 줄에 넣는 방법을 모르겠습니다.

불행히도 저는 sed에 익숙하지 않습니다. stackoverflow와 여기에도 비슷한 질문이 있지만 필요에 맞게 수정할 수는 없습니다.

저는 sed를 사용하는 솔루션을 선호하지만, 이 솔루션이 awk와 같은 다른 도구를 사용하여 구현하기 더 쉽다면 그것도 환영합니다.

답변1

sed 사용

테스트 파일을 만들어 보겠습니다.

$ seq 10 >file

5번째 줄을 파일의 맨 위로 이동하려면:

$ sed '1,4{H;1h;d}; 5{p;x}' file
5
1
2
3
4
6
7
8
9
10

어떻게 작동하나요?

  • 1,4{H;1h;d}

    이렇게 하면 1~4행이 예약된 공간에 저장됩니다.

    구체적으로 H예약된 공간에 줄바꿈을 추가한 후 예약된 공간에 현재 라인을 추가한다. 1행의 경우 개행 문자가 필요하지 않으므로 1h1행을 개행 없이 예약된 공간으로 보내는 명령을 실행합니다. 이 d명령은 인쇄되지 않도록 패턴 공간에서 현재 행을 제거합니다.

  • 5{p;x}

    그러면 5행이 인쇄되고 예약된 공간이 인쇄됩니다. psed에게 패턴 공간(라인 5 포함)을 인쇄하라고 지시합니다. x이제 예약된 공간의 내용이 인쇄되도록 sed put에 모드와 예약된 공간을 스왑하도록 지시합니다.

5행 이후의 행은 변경되지 않습니다.

awk를 사용하세요

$ awk 'NR<5{s=s ORS $0;next} NR==5{print $0 s;next} 1' file
5
1
2
3
4
6
7
8
9
10

여기의 논리는 sed의 논리와 매우 유사합니다. 5행 이전의 모든 행을 변수에 저장합니다 s. 5번째 줄에 도달하면 이를 인쇄한 다음 s를 인쇄합니다. 나머지 줄은 변경되지 않습니다.

관련 정보