파일에 이와 같은 것이 있습니다. 1,2,4의 줄 번호 목록이 있습니다.
- 모든 요구를 충족하는 라인 번호
- 사이의 콘텐츠 추출첫 번째의 출현과마지막일어난
</book>
데이터:
</p><p>abc</p></book><book><p style="text-indent:0em;">def</p></book><book><p>ghi</p><p style="text-indent:0em;"></book><book><div><p>
</div><p>123</p></book><book><p style="text-indent:0em;">456</p><p>789</p><p style="text-indent:0em;"></book><book><div><p>
<div><p>nothing !!!</p></div>
</p><p>ABC</p></book><book><p style="text-indent:0em;">DEF</p></book><book><p>GHI</p><p style="text-indent:0em;"></book><book><div><p>JKL</p></div></book><div>
줄 번호를 입력하세요:1, 2, 4 (명령어에 입력하고 싶은 것)
원하는 출력:
<book><p style="text-indent:0em;">def</p></book><book><p>ghi</p><p style="text-indent:0em;"></book>
<book><p style="text-indent:0em;">456</p><p>789</p><p style="text-indent:0em;"></book>
<book><p style="text-indent:0em;">DEF</p></book><book><p>GHI</p><p style="text-indent:0em;"></book><book><div><p>JKL</p></div></book>
답변1
1) 특정 행 추출
4행 예제에서는 세 번째 행을 제거하여 첫 번째, 두 번째, 네 번째 행을 쉽게 추출할 수 있습니다.
sed 3d file
그러나 파일이 더 복잡할 수 있으므로 보다 일반적인 해결책은 다음과 같습니다.
sed -e 1b -e 2b -e 4b -e d file
따라서 유지해야 하는 각 줄에 대해 스크립트 끝으로 이동하여 b
나머지 파일을 삭제할 수 있습니다.
더 긴 줄 번호 목록의 경우 스크립트를 생성해야 할 수도 있습니다.
sed $(for i in 1 2 4; do echo "-e ${i}b"; done) -e d file
그런데 문제는 줄 번호가 아니라 <book>
줄에 s가 있는지 여부인 것 같습니다. 이것이 사실이라면 줄 번호를 잊어 버리고 다음을 수행하는 것이 좋습니다.
sed '/<book>/!d'
2) 내용 추출
정규식은 *
이런 종류의 작업에 적합하지 않습니다. 이것이 내 개인 버전에 일치하는 부분만 교체하는 sed
명령 옵션이 있는 이유입니다 .o
s
o
sed '/<book>/!d;s_<book>.*</book>_&_o'
그러나 그것은 당신에게 효과가 없으므로 더 많은 정규식 저글링이 필요합니다.
sed '/<book>/!d;s_<book>_\n&_;s_.*\n__;s_\(.*</book>\).*_\1_' file
sed
귀하의 버전이 대체 문자열을 지원하지 않는 경우 \n
실제 개행 문자를 사용하십시오(백슬래시를 통해 이스케이프 처리됨).
sed '/<book>/!d;s_<book>_\
&_;s_.*\n__;s_\(.*</book>\).*_\1_' file
답변2
그리고 perl
:
#!/usr/bin/env perl
use strict;
use warnings;
use v5.10;
my @lines = (1, 2, 4);
while(<>) {
next unless $. ~~ @lines;
chomp;
s#.*?(<book>.*</book>).*#$1#;
say
}