다음과 같은 입력이 주어집니다.
<start>
<header>
This is header section
</header>
<body>
<body_start>
This is body section
<a>
<b>
<c>
<st>111</st>
</c>
<d>
<st>blank</st>
</d>
</b>
</a>
</body_start>
<body_section>
This is body section
<a>
<b>
<c>
<st>5</st>
</c>
<d>
<st>666</st>
</d>
</b>
<b>
<c>
<st>154</st>
</c>
<d>
<st>1457954</st>
</d>
</b>
<b>
<c>
<st>845034</st>
</c>
<d>
<st>blank</st>
</d>
</b>
</a>
</body_section>
</body>
</start>
다음 파싱을 수행하고 싶습니다.
경우 st
의 값 c
태그는 154
다음 전체는 <b>
합니다 </b>
제거에 대한 요구를 태그. 값 154는 파일에 존재하거나 존재하지 않을 수 있습니다.
따라서 값 154가 있으면 다음 부분을 제거해야합니다.
<b>
<c>
<st>154</st>
</c>
<d>
<st>1457954</st>
</d>
</b>
쉘 스크립트로 코딩하고 싶습니다. xslt
시스템이 지원하지 않기 때문에 사용할 수 없습니다 .
답변
pup
HTML 처리를위한 명령 줄 도구 인를 사용할 수 있습니다 . XML의 경우을 사용할 수 있습니다 xpup
.
예를 들어, 제거 할 부품을 찾으려면 다음을 실행하십시오.
$ pup ':parent-of(:parent-of(:contains("154")))' <file.html
<b>
<c>
<st>
154
</st>
</c>
<d>
<st>
1457954
</st>
</d>
</b>
sed
( file.html
HTML 파일이 있는 곳 )을 사용하여 입력에서이 섹션을 제거하려면 다음을 실행하십시오.
sed "s@$(pup ':parent-of(:parent-of(:contains("154")))' <file.html | xargs | tr -d " ")@@g" <(xargs <file.html | tr -d " ")
노트:
xargs <file.html | tr -d " "
공백없이 파일을 한 줄로 병합하는 데 사용 합니다.- 언급 된
pup
명령을 사용 하여 제거 패턴을 찾습니다. - 우리는 다음
sed
을 통해 패턴을 제거합니다sed "s@PATTERN@@g" <(input)
. - 현재 위치를 바꾸려면 (파일을 수정하여)
-i
GNUsed
또는-i'.bak'
BSD를 추가하십시오sed
.
이해하기 쉽도록 다음 스크립트를 사용할 수 있습니다.
function flat_it() { xargs | tr -d " "; }
input=$(flat_it <file.html)
remove=$(pup ':parent-of(:parent-of(:contains("154")))' <<<$input | flat_it)
sed "s@$remove@@g" <<<$input
참고 : 위 방법의 단점은 내용을 포함하여 모든 공백이 제거된다는 것입니다. 더 나은 결과를 얻으려면 다른 평탄화 입력 방법을 사용해야합니다.
그래서 대신에 xargs | tr -d " "
, sed
, ex
또는 paste
사용할 수 있습니다.
다음은 다음을 사용하는 예입니다 ex
.
ex +%j +"s/[><]\zs //g" +%p -scq! file.html
다음은 쉘 기능이있는 버전입니다 (이전 버전을 대체 할 수 있음).
function flat_it() { ex +%j +"s/[><]\zs //g" +%p -scq! /dev/stdin; }