패턴에서 다음 빈 행까지 행을 제거해야 합니다.
예를 들어:
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 파일이고 해당 섹션을 제거하려는 경우 다음과 같은 fruits
YAML 인식 도구를 사용하는 것이 좋습니다.yq
https://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 루프는 나머지 줄을 인쇄합니다.