임시 파일을 사용하지 않고 출력의 처음 N 줄을 끝으로 이동합니다.

임시 파일을 사용하지 않고 출력의 처음 N 줄을 끝으로 이동합니다.

다음과 같은 명령의 출력을 상상해보십시오.

44444
55555
11111
22222
33333

처음 N 행(위 예의 처음 두 행)을 꺼내서 끝에 추가하려면 어떻게 해야 합니까?임시 파일을 사용하지 마십시오(그래서 그냥 파이프를 사용하세요)?

11111
22222
33333
44444
55555

이와 같은 것입니다 | sed -n '3,5p;1,2p'(sed가 명령 순서를 신경 쓰지 않기 때문에 분명히 작동하지 않습니다).

답변1

이 라인을 홀딩 버퍼에 복사한 다음 삭제하세요. 그런 다음 마지막 라인에서 홀딩 버퍼의 내용을 패턴 공간에 추가하세요.

some command | sed '1,NUMBER{           # in this range
H                                       # append line to hold space and
1h                                      # overwrite if it's the 1st line
d                                       # then delete the line
}
$G'                                     # on last line append hold buffer content

gnu sed다음과 같이 쓸 수 있습니다 .

some command | sed '1,NUMBER{H;1h;d;};$G'

다음은 ol' 대안입니다 ed( r출력을 some command텍스트 버퍼에 쓴 다음 la t 다음 줄을 m건너뜁니다 ).1,NUMBER$

ed -s <<IN
r ! some command
1,NUMBERm$
,p
q
IN

지적한 대로 NUMBER출력이 +1줄 미만이면 실패합니다. 보다 안정적인 방법은 다음과 같습니다( gnu sed구문).

some command | sed '1,NUMBER{H;1h;$!d;${g;q;};};$G'

이는 마지막 라인( )이 아닌 한 범위의 라인만 제거합니다. $!d그렇지 않으면 패턴 공간을 유지 버퍼 내용( )으로 덮어쓴 다음 guits q를 사용합니다(현재 패턴 공간을 인쇄한 후).

답변2

떨어져 awk있는:

cmd | awk -v n=3 '
  NR <= n {head = head $0 "\n"; next}
  {print}
  END {printf "%s", head}'

혜택이 초과됩니다.@don_crissti의 sed접근 방식출력에 n라인 수가 적더라도 여전히 작동합니다(라인 출력).

답변3

나는 이미 그것을 가지고 xclip있으며 다음과 같이 할 수 있습니다:

./a_command | xclip -in && xclip -o | tail -n +3 && xclip -o | head -n 2

설명은 다음과 같습니다.

xclip - command line interface to X selections (clipboard)

NAME
       xclip - command line interface to X selections (clipboard)

SYNOPSIS
       xclip [OPTION] [FILE]...

DESCRIPTION
       Reads from standard in, or from one or more files, and makes the data available as an X selection for pasting into X applications. Prints current X selection to standard out.

       -i, -in
              read text into X selection from standard input or files (default)

       -o, -out
              prints the selection to standard out (generally for piping to a file or program)

답변4

POSIX를 사용하세요 ex. 예, 파일 편집용이지만 파이프라인에서 작동합니다.

printf %s\\n 111 222 333 444 555 | ex -sc '1,2m$|%p|q!' /dev/stdin

이는 파이프라인의 시작이나 끝 부분에 임의의 명령을 추가할 수 있으며 동일하게 작동합니다. 더 나아가 의 존재를 고려하면 /dev/stdinPOSIX와 호환됩니다.

(POSIX에 지정되어 있는지는 모르겠지만 /dev/stdinLinux와 Mac OS X 모두에 존재하는 것으로 나타났습니다.)

sedex이는 사용된 예약된 공간에 비해 가독성이 좋습니다. "이 줄을 끝으로 이동" 이라고 말하면 그렇게 됩니다. (나머지 명령은 "인쇄 버퍼" 및 "종료"를 의미하며, 이 역시 꽤 읽기 쉽습니다.)

참고: ex2줄 미만을 입력하면 위에 제공된 명령이 실패합니다.

추가 자료:

관련 정보