#begin command block
#append all lines between two addresses to hold space
sed -n -f - <<\SCRIPT file.xml
\|<tag1>|,\|</tag1>|{ H
#at last line of search block exchange hold and pattern space
\|</tag1>|{ x
#if not conditional ; clear buffer ; branch to script end
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
#do work ; print result; clear buffer ; close blocks
s?*?*?;p;s/.*//;h;b}}
SCRIPT
위의 데이터를 고려할 때 마지막 정리 라인 이전 sed
에 다음과 같은 패턴 공간을 사용해야합니다 .
^\n<tag1>\n<tag2>foo</tag2>\n</tag1>$
당신이 원하는 때마다 패턴 공간을 인쇄 할 수 있습니다 l
. 그런 다음 \n
문자를 지정할 수 있습니다 .
sed l <file
호출 sed
되는 단계에서 각 라인이 처리하는 것을 보여줍니다 l
.
난 그냥 그것을 테스트했고 더 하나를 필요 그래서 \backslash
애프터 ,comma
첫 번째 줄에하지만, 그 작동 등이다. 여기 _sed_function
에이 답변 전체에서 데모 목적으로 쉽게 호출 할 수 있도록 넣었습니다 . (댓글이 포함 된 작품이지만 간결하게하기 위해 제거되었습니다)
_sed_function() { sed -n -f /dev/fd/3
} 3<<\SCRIPT <<\FILE
\|<tag1>|,\|</tag1>|{ H
\|</tag1>|{ x
\|<tag2>[^<]*foo[^\n]*</tag2>|!{s/.*//;h;b}
s?*?*?;p;s/.*//;h;b}}
#END
SCRIPT
<tag1>
<tag2>bar</tag2>
</tag1>
<tag1>
<tag2>foo</tag2>
</tag1>
FILE
_sed_function
#OUTPUT#
<tag1>
<tag2>foo</tag2>
</tag1>
이제 우리는 스위치 것 p
위해 l
우리는 우리가 우리의 스크립트를 개발하고 비 연산 데모를 제거 할 때 함께 작업하는 것을 볼 수 있도록 s?
우리의 마지막 줄 수 있도록 sed 3<<\SCRIPT
단지 외모와 같은 :
l;s/.*//;h;b}}
그런 다음 다시 실행하겠습니다.
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
확인! 그래서 저는 옳았습니다. 좋은 느낌입니다. 자, 우리 l
가 끌어 당기는 선을보기 위해 우리의 뒤를 뒤섞어 봅시다 . 우리는 우리의 현재를 제거 할 수 있습니다 l
과에 하나를 추가 !{block}
그것은 보이는 있도록 :
!{l;s/.*//;h;b}
_sed_function
#OUTPUT#
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
그것이 우리가 그것을 닦아 내기 직전의 모습입니다.
마지막으로 보여 드리고 싶은 것은 H
오래된 공간입니다. 제가 보여줄 수있는 몇 가지 핵심 개념이 있습니다. 그래서 마지막 l
ook을 다시 제거하고 첫 번째 줄을 변경 H
하여 끝에 오래된 공간을 들여다 봅니다 .
{ H ; x ; l ; x
_sed_function
#OUTPUT#
\n<tag1>$
\n<tag1>\n <tag2>bar</tag2>$
\n<tag1>\n <tag2>bar</tag2>\n</tag1>$
\n<tag1>$
\n<tag1>\n <tag2>foo</tag2>$
\n<tag1>\n <tag2>foo</tag2>\n</tag1>$
H
오래된 공간 은 라인 사이클을 유지하므로 이름입니다. 사람들이 자주 트립하는 경우- 내가 자주 트립하는 것은 사용 후 삭제해야한다는 것입니다. 이 경우 x
, e는 한 번만 변경되므로 홀드 공간 은 패턴 공간이되고 그 반대도 마찬가지 입니다.
그 결과 패턴 공간이었던 홀드 공간을 삭제해야합니다. 먼저 다음을 사용하여 현재 패턴 공간을 지 웁니다.
s/.*//
단순히 모든 문자를 선택하고 제거합니다. d
이것이 현재 라인 사이클을 끝내고 다음 명령이 완료 되지 않아 사용할 수 없기 때문에 스크립트가 거의 손상됩니다.
h
이것은 비슷한 방식으로 작동 H
하지만 보류 공간을 덮어 쓰므로 보류 패턴의 상단에 빈 패턴 공간을 복사하여 효과적으로 삭제했습니다. 이제는 다음과 같이 할 수 있습니다.
b
밖.
이것이 제가 sed
스크립트를 작성하는 방법 입니다.