패턴을 검색하고 세 번째 빈 줄에 텍스트를 추가하세요.

패턴을 검색하고 세 번째 빈 줄에 텍스트를 추가하세요.

패턴을 검색한 다음 세 번째 빈 줄을 찾을 때까지 패턴 뒤의 빈 줄을 세어 그 빈 줄에 쉼표와 세미콜론을 넣으려고 합니다. 빈 줄 사이에 많은 양의 데이터가 있을 수도 있고, 빈 줄 사이에 텍스트가 한 줄만 있을 수도 있습니다.

GROUP DIRECTORY CATEGORIES
datadata

Grouping Cat
datadata

datadata
this is the 3rd blank line

나는 성공하지 않고 다음을 시도했습니다. 어떤 제안이 있으십니까?

sed '/GROUP DIRECTORY CATEGORIES/,/^$/^$/^$/,;/' file1>file2
sed '/GROUP DIRECTORY CATEGORIES/$/$/$/,;/' file1>file2
sed '/GROUP DIRECTORY CATEGORIES/{$;$;$/./,;/1;}' file1>file2

답변1

sed이 목적으로 사용될 수 있지만 계산과 관련된 모든 작업은 를 사용하여 더 쉽게 수행할 수 있습니다 awk.

이 테스트 파일을 고려해 보겠습니다.

$ cat file1
GROUP DIRECTORY CATEGORIES
datadata

Grouping Cat
datadata

datadata

Above is 3rd blank line

,;다음의 세 번째 빈 줄에 a를 추가하려면 다음을 수행하세요 GROUP DIRECTORY CATEGORIES.

$ awk '/GROUP DIRECTORY CATEGORIES/{f=1}  f && /^$/ {f++; if (f==4) $0=",;"} 1' file1
GROUP DIRECTORY CATEGORIES
datadata

Grouping Cat
datadata

datadata
,;
Above is 3rd blank line

작동 방식:

  • /GROUP DIRECTORY CATEGORIES/{f=1}

    정규식과 일치하는 행이 발견될 때마다 GROUP DIRECTORY CATEGORIES변수는 f1로 설정됩니다.

  • f && /^$/ {f++; if (f==4) $0=",;"}

    0이 아니고 f현재 행이 비어 있으면 1을 /^$/추가합니다 f. 4 이면 f현재 빈 줄을 ,;.

  • 1

    1awk의 print-the-line에 대한 신비한 약어입니다.

답변2

기본적으로 귀하의 표현식은 패턴 공간으로 한 번에 한 줄만 읽으므로 접근 방식이 실패합니다. 따라서 적절한 정규식을 구성할 수 있더라도 두 개 이상의 빈 줄과 일치할 수 없습니다.

그러나 그것은N루프 내의 명령을 사용하여 여러 줄을 패턴 공간으로 읽을 수 있습니다 . GNU sed의 여러 줄 수정자 외에도 개행은 여러 줄 패턴 공간에서 시퀀스로 표시됩니다 . 따라서 빈 줄을 테스트하려면 대신 \n사용해야 합니다 . 예를 들면 다음과 같습니다.\n\n^$

sed -E '
  /GROUP DIRECTORY CATEGORIES/ {
  :a                            # label the start of a loop
  $!N                            # if not at the end of file, read & append the next line
  s/((\n\n.*){2})\n\n/\1\n,;\n/ # match and capture 2 instances of successive newlines, 
                                # followed by a 3rd; if found, replace the 3rd by \n,;\n 
  t                             # branch out of the loop on successful replacement
  ba                            # else branch back to label 'a'
  }' file1

GNU sed에서는 이 t;ba시퀀스를 Ta.

답변3

이 복잡한 주소 지정 요구 사항은 ex(또는 vi)이 실제로 작용하는 곳입니다.

exPOSIX 전용 도구vi이것은 ("비주얼 편집기")의 전신입니다. Vim에서는 모든 스타일 명령을 계속 사용할 수 있다는 점은 주목할 가치가 있습니다 ex.vi

Vim에서 문서의 시작 부분부터 첫 번째 인스턴스를 시작한다고 가정하면 vi다음과 같이 할 수 있습니다./pattern/

  • vi file.txt명령줄에서 입력하고 눌러 파일을 엽니다.<Enter>

  • 선행 콜론을 포함하여 다음을 입력합니다. 그런 다음 을 누르십시오 <Enter>.

    :0/GROUP DIRECTORY CATEGORIES//^$//^$//^$/s/^/,;/
    
  • :x변경 사항을 저장하려면 입력하고 누르세요 <Enter>.

위 명령에서 소문자 이전의 모든 내용 s주소. 이 s명령은 매우 명확해야 합니다.

주소는 "파일의 맨 처음(라인 '0')에서 시작하여 'GROUP DIRECTORY CATEGORIES'의 첫 번째 인스턴스, 거기에서 첫 번째 빈 라인 인스턴스, 다음 빈 라인 인스턴스, 그런 다음 다음 명령을 실행하고 대체 명령을 실행하십시오."

그것을 분리하는 방법은 여러 가지가 있습니다. 단일 라이닝일 필요는 없습니다.

ex다음 명령을 사용하여 이 편집을 수행 할 수도 있습니다 .

0/GROUP DIRECTORY CATEGORIES/
/^$/
//
//
s//,;/
x

관련 정보