스레드와 비슷한 지침이 있습니다.일치하는 줄과 일치하는 줄 내의 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>
...