마지막 행보다 두 행 앞에 새 행을 삽입하고 싶습니다. 따라서 내 원본 파일이 다음과 같은 경우:
1
2
3
4
5
결과는
1
2
3
New line
4
5
답변1
사용 ed
:
$ printf '$-1i\nNew line\n.\n,p\n' | ed -s file
1
2
3
New line
4
5
스크립트 편집 ed
:
$-1i
New line
.
,p
$-1
먼저 끝에서 한 행 위의 행 으로 이동 ( )하고 i
해당 행 위에 새 내용을 삽입( )합니다. 삽입된 내용은 점 하나로 끝납니다(여러 줄 허용). 마지막 것은 ,p
터미널에서 완전히 수정된 버퍼를 보여줍니다.
새 파일로 리디렉션하거나 다음을 사용하여 원본 파일에 다시 쓸 수 있습니다.
printf '$-1i\nNew line\n.\nw\n' | ed -s file
( ,p
로 변경 w
).
후자는 또한 ex
이 작업에서 사용할 것입니다.
printf '$-1i\nNew line\n.\nw\n' | ex -s file
ed
ex
표준 줄 기반 편집기(전체 화면 편집기 아님)이며 시스템과 함께 제공되어야 합니다 . 이는 -s
사람마다 다른 의미를 가지지만 이와 같은 일괄 모드 편집 작업을 수행할 때 두 가지 모두에 적용됩니다.
추가 자료:
- 데일 도허티와 팀 오라일리(1987). "수석 편집자".유닉스 텍스트 처리. 헤이든 북스.
답변2
head
이는 간단한 합계로 수행할 수 있습니다 tail
.
$ output=$(head -n -2 file ; echo 'new line' ; tail -2 file)
$ echo "$output" > file
주석에서 언급했듯이 후행 빈 줄을 먹습니다. 따라서 후행 빈 줄을 유지하려면
$ head -n -2 file >> file.tmp
$ echo 'new line' >> file.tmp
$ tail -2 file >> file.tmp
$ mv file.tmp file
또는 한 줄
$ head -n -2 file >> file.tmp ; echo 'new line' >> file.tmp; tail -2 file >> file.tmp ; mv file.tmp file
답변3
sed
GNU를 사용할 수도 있습니다:
sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile
파일의 마지막 줄에서 세 번째 줄에 줄을 삽입합니다 New-line
(마지막 줄 앞에 줄을 삽입합니다).
이는 ewline 다음에 ewline이 아닌 다른 항목과 (\n[^\n]*){3}$
일치하며 파일 끝에서 시작하여 최대 3번 일치합니다. 여기서 옵션은 대소문자입니다.\n
\n
-z
sed파일을 단일 라인(NUL 문자로 구분된 라인)으로 읽습니다. 따라서 아래에서만 일치합니다(강조표시한 별표 사이).
3*\n
4\n
5\n*
이식성을 위해 다음을 사용합니다.
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile
교체 부분에서 여전히 줄 바꿈을 sed
처리할 수 없는 경우 실제 줄 바꿈을 사용하거나 + 키를 누른 다음 Enter 키를 인쇄하는 제어 문자를 누를 수 있습니다.\n
CtrlVEnter^M
sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\
New-line&/' infile
어떻게 작동하나요?
N
각 줄을 추가sed패턴 공간을 읽고 모든 라인을 읽을 때까지 새 라인을 추가합니다. 라벨 정의 :t
및 $!bt
설명sedt
파일의 끝이 아닌 한 호출 레이블로 점프합니다 .
답변4
이는 행의 내용을 삽입하는 데 매우 강력해야 하지만 파일을 두 번 스캔해야 합니다( wc
첫 번째 패스의 경우).
sed "$(($(wc -l < yourfile)-$N))a"'new line' yourfile