특정 줄을 일치시키고 다음을 제외한 모든 줄을 인쇄합니다.

특정 줄을 일치시키고 다음을 제외한 모든 줄을 인쇄합니다.

스레드와 비슷한 지침이 있습니다.일치하는 줄과 일치하는 줄 내의 n번째 줄을 인쇄합니다.

특정 줄을 일치시키고 인쇄한 다음 다음 줄(아래 첫 번째 줄)을 제거한 다음 특정 줄이 일치할 때까지 나머지 줄을 인쇄해야 합니다.

즉, 로 </s>시작하는 줄 다음에 오는 줄만 삭제하면 됩니다 <doc.

내 파일:

<doc>
</s>
<s>
Bla
bla
bla
.
</s>
<s>
Bla
bla
bla
.
</s>
</doc>
<doc>
</s>
...

내가 원하는 출력:

<doc>
<s>
Bla
bla
bla
.
</s>
<s>
Bla
bla
bla
.
</s>
</doc>
<doc>
...

답변1

sed기본 지식이 있으면 이 질문을 이해하는 것이 어렵지 않습니다.

sed '/<doc>/{n;/<\/s>/d;}'

가 있는 줄의 경우 <doc>인쇄하고 로 다음 줄을 읽은 n다음 아래 줄에 포함된 경우 </s>(슬래시를 이스케이프해야 함) 로 삭제합니다 d.

좀 더 자세히 설명하자면, /expression/{command;command;...;}패턴과 일치하는 라인에만 명령을 실행한다는 의미이므로 다른 라인은 모두 그대로 출력되고 해당 <doc>라인 에 대해서는 n실행됩니다. 이 명령은 현재 줄을 인쇄하고 다음 줄을 읽으므로 다음 줄에서 다음 명령이 실행됩니다. 여기서도 또 다른 명령( ) d이 "주소"( )와 함께 나타나므로 포함된 줄만 /<\/s>/삭제되고 그렇지 않으면 인쇄됩니다. 두 경우 모두 스크립트는 다음 줄을 계속 실행합니다.d</s>

답변2

GNU 사용 sed:

sed -z -i 's:<doc>\n</s>:<doc>:g' infile.txt

이는 <doc>다음 </s><doc>. sed의 플래그는 -i내부 교체에 사용되며 이 g플래그가 대체됩니다.모두일어난. -z행이 NULL 문자로 구분됩니다.

답변3

태그해주신대로 shell_script추천드려요방법:

awk '/^<doc>/ && getline nl > 0 && nl!~/^<\/s>/{ print $0 RS nl }1' file

산출:

<doc>
<s>
Bla
bla
bla
.
</s>
<s>
Bla
bla
bla
.
</s>
</doc>
<doc>
...

관련 정보