마지막 줄 앞에 텍스트 N줄 삽입

마지막 줄 앞에 텍스트 N줄 삽입

마지막 행보다 두 행 앞에 새 행을 삽입하고 싶습니다. 따라서 내 원본 파일이 다음과 같은 경우:

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

edex표준 줄 기반 편집기(전체 화면 편집기 아님)이며 시스템과 함께 제공되어야 합니다 . 이는 -s사람마다 다른 의미를 가지지만 이와 같은 일괄 모드 편집 작업을 수행할 때 두 가지 모두에 적용됩니다.

  • ed. “셸 및 유틸리티.” 기본사양. IEEE 1003.1:2017. 그룹을 엽니다.
  • ex. “셸 및 유틸리티.” 기본사양. IEEE 1003.1:2017. 그룹을 엽니다.

추가 자료:

답변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

sedGNU를 사용할 수도 있습니다:

sed -zE 's/(\n[^\n]*){3}$/\nNew-line&/' infile

파일의 마지막 줄에서 세 번째 줄에 줄을 삽입합니다 New-line(마지막 줄 앞에 줄을 삽입합니다).

이는 ewline 다음에 ewline이 아닌 다른 항목과 (\n[^\n]*){3}$일치하며 파일 끝에서 시작하여 최대 3번 일치합니다. 여기서 옵션은 대소문자입니다.\n\n-zsed파일을 단일 라인(NUL 문자로 구분된 라인)으로 읽습니다. 따라서 아래에서만 일치합니다(강조표시한 별표 사이).

3*\n
4\n
5\n*

이식성을 위해 다음을 사용합니다.

sed -e ':t;N;$!bt; s/\(\n[^\n]*\)\{2\}$/\nNew-line&/' infile

교체 부분에서 여전히 줄 바꿈을 sed처리할 수 없는 경우 실제 줄 바꿈을 사용하거나 + 키를 누른 다음 Enter 키를 인쇄하는 제어 문자를 누를 수 있습니다.\nCtrlVEnter^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

관련 정보