Android에서 "g" 수정자 없이 "sed"를 사용하시나요?

Android에서 "g" 수정자 없이 "sed"를 사용하시나요?

루팅된 Nexus 10에 Stericson 비지박스를 설치했습니다.

</verse-sub-section>파일의 첫 번째 인스턴스를 다음으로 바꾸고 싶습니다 </section>.

          <section>Psalm of David</verse-sub-section>
          <verse-sub-section>David Weeps</verse-sub-section>

sed -i 's#</verse-sub-section>#</section>#' file마지막에 수식어를 사용하지 않아도 모든 것이 교체됩니다 </verse-sub-section>.</section>g

비지박스 때문인가요? 아니면 내 명령이 잘못됐나요? 이를 달성하려면 무엇을 사용해야 합니까(비지박스가 있는 안드로이드에서)?

비지박스 버전: 1.23.1

답변1

처음 일치하는 인스턴스까지 파일의 일부로 교체를 제한하려면 교체 명령 앞에 다음을 추가하면 됩니다.범위형태 1,\#pattern#

busybox sed '1,\#</verse-sub-section># s#</verse-sub-section>#</section>#' file

\#명령에 백슬래시 이스케이프가 도입되지 않는 한 대체 구분 기호 앞에 백슬래시 이스케이프를 사용한다는 점에 유의하세요 s.

첫 번째 줄에서 일치하는 항목이 발생하면 원하는 동작이 생성되지 않습니다. GNU sed는 이 경우를 처리하기 위한 다양한 형식을 지원 0,\#pattern#하지만 busybox sed(적어도 제가 테스트할 수 있었던 버전 BusyBox v1.22.1 (Ubuntu 1:1.22.0-8ubuntu1))는 지원하지 않는 것으로 보입니다. 그것.

답변2

귀하의 질문은 모호합니다. 찾고 싶다면첫 번째의 예</verse-sub-section> 파일 전체에 걸쳐를 으로 바꾸고 </section>다른 답변을 확인하세요. 내 해석은 입력이 주어진 것입니다.

1    <section>Genesis</verse-sub-section>
2    <verse-sub-section>In the beginning, God ...</verse-sub-section>
3    <section>Psalm of David</verse-sub-section>
4    <verse-sub-section>David Weeps</verse-sub-section>

행 1과 3을 </verse-sub-section>바꾸려고 합니다 . </section>이것이 귀하의 질문이라면 대답은 다음과 같습니다.

sed -i 's#\(<section>.*\)</verse-sub-section>#\1</section>#' file

<section>놓다오래된명령 필드는 포함된 행만 처리하도록 보장됩니다. 줄의 일부를 구분합니다. 즉, 에서 시작하여 까지(포함하지 않음) 부분입니다. 그리고s/old/new/<section>\(…\)<section></verse-sub-section>\1새로운필드는 일치하는 문자열의 인식된 하위 문자열이 파일에 다시 삽입되도록 합니다. 즉, 변경되지 않은 상태로 유지됩니다.

적어도 그것이 *nix의 기본 버전에서 작동하는 방식입니다. Android도 다르지 않지만 busybox에서 작동한다고 보장할 수는 없습니다.

관련 정보