패턴에서 다음 빈 행까지 행 제거

패턴에서 다음 빈 행까지 행 제거

패턴에서 다음 빈 행까지 행을 제거해야 합니다.

예를 들어:

pets:
- cat
- dog
- fish

fruits:
- apple
- banana
- orange

colors:
- red
- blue
- pink

"fruit"(모드)에서 다음 빈 줄까지 모든 줄을 삭제하여 다음과 같은 파일을 만들고 싶습니다.

pets:
- cat
- dog
- fish

colors:
- red
- blue
- pink

귀하의 답변에 진심으로 감사드립니다. 그러나 어떤 이유로 그것은 저에게 효과가 없습니다.

실제 파일의 예는 다음과 같습니다.

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

2021  30  0 44  57.**** -23.****  -68.**** 149.****                                        
L02   2021  30  0 45  19.109
L02   2021  30  0 45  37.419
L04   2021  30  0 45  19.899
L04   2021  30  0 45  38.879

2021  30  1  6  32.7126 -23.45682  -68.65472 100.2616 
L01   2021  30  1  6  48.010
L01   2021  30  1  6  59.480*
L02   2021  30  1  6  47.970
L02   2021  30  1  6  59.380

나는 필요하다: 테이블 헤더에 ****가 표시된 데이터 세트를 삭제해야 합니다. 이 예에서는 다음을 삭제합니다.

2021  30  0 44  57.**** -23.****  -68.**** 149.****                                        
L02   2021  30  0 45  19.109
L02   2021  30  0 45  37.419
L04   2021  30  0 45  19.899
L04   2021  30  0 45  38.879

이 데이터를 최종 파일로 가져옵니다.

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

2021  30  1  6  32.7126 -23.45682  -68.65472 100.2616 
L01   2021  30  1  6  48.010
L01   2021  30  1  6  59.480*
L02   2021  30  1  6  47.970
L02   2021  30  1  6  59.380

내가 뭘 한거지:

sed '/\*\*\*/,/^$/d' filename.data

그리고

awk '/\*\*\*/,/^$/{next}1' filename.data

그러나 패턴 이후의 모든 항목을 삭제하고 첫 번째 그룹만 남겨둔 후 결과는 다음과 같습니다.

2021  29 23 52  12.2358 -23.40477  -68.53253 142.9283 
L01   2021  29 23 52  32.950 
L01   2021  29 23 52  48.440*
L03   2021  29 23 52  32.730 
L03   2021  29 23 52  48.030 

다른 건 없고 나머지는 삭제되었습니다.

내 질문이 이해되기를 바랍니다.

CSH 및 BASH에 관해서는 그들이 쉘이라는 것을 알고 있습니다. 즉, 제가 사용하는 명령이 있고 이를 CSH에서 사용할 수 있어야 한다는 뜻입니다.

미리 감사드립니다

답변1

csh쉘 이며 bash텍스트 처리에 적합하지 않지만 sed이러한 쉘에서 텍스트 처리 유틸리티를 호출할 수 있습니다. 를 사용하면 sed다음과 같이 두 패턴 사이의 라인 범위를 삭제할 수 있습니다.

sed '/^fruits:/,/^$/d' yourfile

설명: 패턴은 ^fruits:로 시작하는 줄과 일치하고 fruits:, 패턴은 ^$빈 줄( ^줄의 시작, $줄의 끝)과 일치합니다. 이러한 패턴을 평균으로 구분하면 ,다음 명령이 범위의 모든 행에 적용됩니다. 명령은 d(삭제)입니다.

답변2

이것이 YAML 파일이고 해당 섹션을 제거하려는 경우 다음과 같은 fruitsYAML 인식 도구를 사용하는 것이 좋습니다.yqhttps://kislyuk.github.io/yq/:

$ yq -y 'del(.fruits)' file
pets:
  - cat
  - dog
  - fish
colors:
  - red
  - blue
  - pink

답변3

awk '/^fruits/,/^$/{next}1' infile

기본 인쇄되지만 일치하는 패턴으로 시작하는 모든 항목을 건너뜁니다.fruits줄의 시작 부분에서 첫 번째 빈 줄까지.

답변4

사용 awk:

awk '{arr[NR]=$0}/fruits/,/^$/ { if (/fruits/) line1=NR; if (/^$/) line2=NR}END{for(j=line1;j<=line2;j++) delete arr[j] ; for (i in arr) print arr[i]}' file

 pets:
 - cat
 - dog
 - fish

 colors:
 - red
 - blue
 - pink

arr메인 블록에서 먼저 레코드 번호로 인덱스된 배열을 만듭니다.

그런 다음 이 표현식을 사용하여 if (/fruit/) line1=NR;첫 번째 패턴과 일치하는 행을 찾습니다. 마찬가지로 다음 빈 줄을 찾으세요. 이제 arr이러한 레코드 사이의 배열 요소와 arr이러한 레코드를 포함하는 요소가 삭제됩니다.

END블록 내에서 for 루프는 나머지 줄을 인쇄합니다.

관련 정보