Linux에 다음 데이터가 포함된 "test" 파일이 있습니다.
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
파일의 마지막 줄을 잘라서 두 번째 위치에 넣어야 합니다. 아래와 같아야 합니다.
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
답변1
ed
이 문제 는 기본적으로 스트림 프로세서가 아닌 스크립트 가능한 텍스트 편집기이기 때문에 실제로 를 사용하여 해결하는 것이 가장 쉬울 것입니다 . 예를 들어 ed
,
# Create test file
~> printf "%s\n" aaaaaa bbbbbb cccccc dddddd eeeeee >test.txt
~> cat test.txt
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
# Use ed to open the file, move the last line after the first, save, and quit
~> printf "%s\n" '$m1' wq | ed test.txt
35
35
~> cat test.txt
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
답변2
버퍼 방법 유지:
sed '$x;1!H;1p;$!d;x;s/\n//
' <<\IN
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN
... 첫 번째 줄 H
이 아닌 모든 줄이 변경되어 인쇄되는 첫 번째 줄이 됩니다. 마지막 줄 에서는 홀드 및 패턴 공간을 변경합니다.!
p
$
x
앞으로이는 H
이전 작업(저장된 줄을 마지막 줄에 추가)을 수행한 다음 d
출력에서 !
마지막 줄 이 아닌 모든 줄을 제거합니다 $
.
$
마지막 줄 에서는 x
공백을 다시 변경하여 s///
첫 번째 \n
ewline 문자(두 번째 줄에 추가된 추가 내용을 처리함)를 대체하고 자동으로 배치를 인쇄합니다.
산출:
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
고정 버퍼를 사용하지 않고:
cat <<\IN >infile
aaaaaa
bbbbbb
cccccc
dddddd
eeeeee
IN
...예제를 실제 파일에 저장하세요...
sed '1p;$!d;r infile' <infile | sed '3d;$d'
이는 첫 번째 줄만 인쇄하는 첫 번째 줄로 리디렉션된 <infile
다음 출력 에서 sed
마지막 줄 이 아닌 모든 줄을 제거합니다 . 마지막 줄은 자동으로 인쇄되지만 이는 최종 명령을 실행하는 유일한 줄이기도 합니다.stdin
p
d
!
$
r
infile
다시도착하다 stdout
. 이 모든 것이 |
두 번째 파이프로 연결되고 sed
출력 d
에서 세 번째이자 마지막 입력 행을 제거하면 재배열이 완료됩니다.
산출:
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
답변3
awk를 사용하는 간단한 방법:
~$ awk '{a[NR]=$0}END{print a[1];print a[NR];for(i=2;i<NR;i++){print a[i]}}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
각 행을 배열에 저장 a
한 다음 원하는 순서(첫 번째 행, 마지막 행( NR
) 및 2부터 두 번째 행부터 마지막 행까지)로 배열을 인쇄합니다.
head/tail과 sed의 조합을 사용하십시오:
~$ head -1 f;tail -1 f;sed '1d;$d' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
첫 번째와 마지막 줄을 인쇄한 다음 sed를 사용하여 첫 번째와 마지막 줄을 삭제합니다.
sed만 사용하면 이 명령만 찾을 수 있습니다. 더 좋은 방법이 있다고 확신합니다.
~$ sed '${p;x;s/^\n//;p};2,${H;d}' f
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd
첫 번째 줄이면 인쇄합니다(기본값). 두 번째 줄부터 홀딩 버퍼( )
에 들어가고 패턴 공간( )에서 제거됩니다. 마지막 라인이라면 인쇄하고( ), 홀딩 버퍼를 가져와서( ), 빈 라인을 제거 하고( ) 인쇄합니다( ).H
d
p
x
s/^\n//
p
답변4
펄 사용:
perl -e 'my @lines = <>; print for @lines[0, $#lines, 1..$#lines-1]' file
awk 사용:
$ awk '
{lines[NR]=$0}
END{
print lines[1], lines[NR];
for (i=2; i<NR; i++) {print lines[i]}
}
' OFS=$'\n' file
산출
aaaaaa
eeeeee
bbbbbb
cccccc
dddddd