sed 그룹 명령에서 범위의 첫 번째 줄과 마지막 줄 인용

sed 그룹 명령에서 범위의 첫 번째 줄과 마지막 줄 인용

sed 스크립트에서 group 명령을 사용할 때 범위의 첫 번째 줄과 마지막 줄을 참조할 수 있는 방법이 있습니까?

범위의 첫 번째 행과 마지막 행과 그 사이에서 선택한 행을 인쇄하고 싶습니다.

#n
/StartLinePattern/,/EndLinePattern/{
  /PatternOfSubLineToPrint/p;
}

다른 그룹화 명령을 포함하면 이 문제를 해결할 수 있다는 것을 알고 있습니다.성냥범위의 첫 번째 및 마지막 줄(다시 말하지만) 그룹화되지 않은 명령 표준과 유사한 작업을 수행하는 것이 더 깨끗하고 빠르며 재사용이 가능합니다.

1p;$p

위의 내용을 그룹에 포함시키려고 했지만 작동하지 않았습니다. 1그것은 $당신이 속한 범위에 관계없이 절대적인 것 같습니다 .

배경

XML 파일에서 요소를 필터링하기 위한 sed 스크립트를 만들었습니다. 이를 위해 그룹 명령과 함께 범위를 사용하여 범위 내의 특정 하위 요소를 인쇄합니다. 따라서 스크립트는 유지하려는 모든 항목을 인쇄하여 작동합니다.

#n
/<Parent\>/,<\/Parent>/{
  /<Child1\>/,/<\/Child1>/p;
  /<Child2\>/,/<\/Child2>/p;
  /<SingleLineChild\>/p;
}

답변1

다음을 사용하여 이 작업을 수행할 수 있습니다.빈 정규 표현식즉, //시작 뒤의 첫 번째 정규식으로 {
예를 들어 다음을 입력합니다.

hello
world
start
inner1
inner2
inner3
end
outer

당신이 달리면

sed -n '/start/,/end/{
//p
/inner1/p;/inner3/p
}' infile

그것은 인쇄한다

start
inner1
inner3
end

너는 볼 수있어어떻게 작동하나요?...중요한 부분만 다시 게시합니다.

a 가 REGEX비어 있으면(예: //) 마지막으로 적용된 마지막 명령에 사용된 마지막 명령을 지정하는 sed것과 같습니다 REGEX(주소 또는 대체 명령의 일부로).


범위의 시작이나 끝을 제외하려면 다른 테스트를 추가하면 됩니다.

sed -n '/start/,/end/{
//{
/start/!p
}
/inner1/p;/inner3/p
}' infile

관련 정보