이전 줄이 이미 비어 있지 않은 한, 패턴과 일치하는 각 줄 앞에 개행 문자를 삽입합니다.

이전 줄이 이미 비어 있지 않은 한, 패턴과 일치하는 각 줄 앞에 개행 문자를 삽입합니다.

패턴을 포함하는 줄 앞에 새 줄을 추가해야 합니다. 패턴은 항상 현재 줄의 첫 번째 문자열이라고 가정할 수 있습니다. 예를 들어

This is a
pattern
This is a
pattern

sed다음 명령을 사용하여 새 줄을 추가할 수 있습니다.

sed -i 's/pattern\+/\n&/g' file

출력을 얻다

This is a

pattern
This is a

pattern

여러 개의 새 행이 추가되는 것을 방지하기 위해(여러 번 실행하는 경우) 패턴 앞의 행이 비어 있는지 확인하고 싶습니다. 난 내가 이걸 할 수 있다는 걸 알아

if [ "$line" == "" ]; then

하지만 처음에 패턴과 일치하는 이전 줄을 어떻게 결정합니까?

편집: 패턴이 여러 번 나타날 수 있습니다.

답변1

이전 행을 예약된 공간에 저장할 수 있습니다.

sed '
 /^pattern/{
   x
   /./ {
     x
     s/^/\
/
     x
   }
   x
 }
 h'

그러나 더 명확할 것입니다 awk.

awk '!previous_empty && /pattern/ {print ""}
     {previous_empty = $0 == ""; print}'

GNU 구현에 내부 편집 옵션이 sed있는 것처럼 GNU 구현에도 1개의 기능이 있습니다 .-iawk-i /usr/share/awk/inplace.awk


^사용하지 마세요-i inplace현재 작업 디렉터리(as or)에서 확장 기능을 먼저 gawk로드 하려고 하면 누군가가 해당 디렉터리에 악성 코드를 심었을 수 있습니다. 시스템과 함께 제공되는 확장 프로그램 의 경로 는 다를 수 있습니다. 출력을 참조하세요.inplaceinplaceinplace.awkinplacegawkgawk 'BEGIN{print ENVIRON["AWKPATH"]}'

답변2

귀하의 질문이 원래 sed에 관한 것이라는 것을 알고 있지만 vim에는 매우 간단한 답변이 있습니다.

:g/.\npattern/norm o

또는 명령줄에서 완전히 실행하려는 경우:

vim file -c "g/.\npattern/norm o" -c "wq"

작동 방식은 다음 정규식과 일치하는 줄을 찾는 것입니다.

.\npattern

이는 패턴을 따르는 공백이 아닌 줄입니다. 그런 다음 각 일치 항목에 대해 norm o현재 커서 위치 아래에 개행 문자를 여는 다음 명령을 적용합니다 .

답변3

하지만 처음에 패턴과 일치하는 이전 줄을 어떻게 결정합니까?

흠... 아마 이게 먹힐 것 같아요.

사용 grep-B전환:

 -B num, --before-context=num
         Print num lines of leading context before each match.  See
         also the -A and -C options.

다음 파일을 고려해보세요.

cat infile 
foo

bar
baz

이제 grepfor를 수행 하면 bar이전 행은 비어 있어야 합니다.

if [[ $(grep -B 1 'bar' infile | head -1) == "" ]]; then echo "line is empty"; fi
line is empty

grepon 을 사용하는 것과 반대로 baz이전 줄은 다음과 같습니다.아니요비어 있는:

if [[ $(grep -B 1 'baz' infile | head -1) == "" ]]; then echo "line is empty"; fi
<no output>

답변4

gnus를 사용한 경우(Linux 및 기타 여러 시스템에서는 기본값이며 모든 사람이 사용할 수 있음)

sed -zri  's/([^\n]\n)(pattern)/\1\n\2/g' file

어디

  • ([^\n]\n)(pattern)비어 있지 않은 줄 이후의 패턴
  • -z널 문자로 "줄"을 구분합니다(슬러프 파일).
  • -r확장자가 포함된 정규 표현식

관련 정보