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