패턴을 검색한 다음 세 번째 빈 줄을 찾을 때까지 패턴 뒤의 빈 줄을 세어 그 빈 줄에 쉼표와 세미콜론을 넣으려고 합니다. 빈 줄 사이에 많은 양의 데이터가 있을 수도 있고, 빈 줄 사이에 텍스트가 한 줄만 있을 수도 있습니다.
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
변수는f
1로 설정됩니다.f && /^$/ {f++; if (f==4) $0=",;"}
0이 아니고
f
현재 행이 비어 있으면 1을/^$/
추가합니다f
. 4 이면f
현재 빈 줄을,;
.1
1
awk의 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
)이 실제로 작용하는 곳입니다.
ex
는POSIX 전용 도구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