sed - 첫 번째 정규식에서 찾은 두 번째 정규식과 일치하는 첫 번째 줄을 대체하여 값을 추출합니다.

sed - 첫 번째 정규식에서 찾은 두 번째 정규식과 일치하는 첫 번째 줄을 대체하여 값을 추출합니다.

가비지가 N번 이상 반복될 수 있는 줄이 포함된 TestData.txt 파일이 있고 "Model=Default" 줄의 위치가 고정되어 있지 않은 경우

...
junk
junk

Model="C"
junk
junk
Size="81"
junk

Model="Default"   <---- Start of "Default" block
junk
...
junk
Size="47"         <---- Required value of size (first "Size=" line after "Default")
junk
junk

Model="A"
junk
Size="22"
junk
junk

Model="T"
junk
junk
Size="32"
junk
...

기본적으로 크기 값을 추출하려는 경우 다음은 일치하는 줄을 인쇄한 다음 두 번째 sed 명령을 대체하여 적용하여 크기 값을 추출하는 방식으로 작동합니다.

sed -ne '/="Default"/,/Size=/p' TestData.txt | sed -ne 's|Size="\([1-9][0-9]*\)"|\1|p'

이 인쇄47, 기본값 섹션의 크기 매개변수에 필요한 값입니다.

두 개의 sed 작업을 보다 효율적인 단일 sed 호출로 결합할 수 있습니까?

(이것은 "크기" 사양이 포함된 여러 블록이 있는 구성 파일에서 단일 값을 추출하기 위해 더 복잡한 정규식을 사용하는 실제 작업의 단순화된 형태입니다.)

답변1

두 번째 필터를 다음과 같이 추가할 수 있어야 합니다.하위 표현식중괄호 사이

sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p}' TestData.txt

또는 POSIXly

sed -ne '/="Default"/,/Size=/ {s/Size="\([1-9][0-9]*\)"/\1/p
}' TestData.txt

바라보다sed에서 명령 편집

[2addr] {function
function
...
}

sed 함수 목록은 패턴 공간이 선택된 경우에만 실행됩니다. sed 함수 목록은 중괄호로 묶고 줄 바꿈으로 구분해야 하며 다음 규칙을 따라야 합니다. 중괄호 앞이나 뒤에 공백이 있을 수 있습니다. 함수 앞에는 공백이 있을 수 있지만 뒤에는 공백이 있을 수 없습니다. 닫는 중괄호 앞에 개행 문자가 있어야 하며 그 앞이나 뒤에는 공백이 있을 수 있습니다.

관련 정보