sed+regex를 사용하여 텍스트 파일의 지정된 위치에 줄을 삽입하는 방법은 무엇입니까?

sed+regex를 사용하여 텍스트 파일의 지정된 위치에 줄을 삽입하는 방법은 무엇입니까?

아래 예와 비슷한 텍스트 파일이 있습니다.

삽입하고 싶어요

<string>insert-me</string>

지정된 줄에.

어떻게 해야 합니까? 나는 다음과 비슷한 변형을 시도했습니다.

sed "/s/<key>first</key>/\n        <array>/\n/test/g" test.txt

"대체 명령의 잘못된 플래그" 오류가 계속 발생합니다.

감사해요

예제 텍스트 파일:

<record>
    <key>first</key>
    <array>
        --I want to insert the line here--
        <string>hello</string>
        <string>world</string>
        </array>
</record>
<record>
    <key>second</key>
    <array>
        <string>its</string>
        <string>me</string>
        <string>again</string>
        <string>hello</string>
        <string>world</string>
        <string>again</string>
    </array>
</record>

답변1

여기에는 몇 가지 질문이 있습니다(정규식 도구를 사용하여 구조화된 데이터를 구문 분석하려는 일반적인 질문 외에).

  1. 패턴(또는 대체)에 슬래시가 포함된 경우 sed 명령에 다른 구분 기호를 사용하거나 슬래시를 이스케이프 처리해야 합니다.

  2. sed는 (보통) 라인 지향적이므로 다음을 사용하여 추가 라인을 패턴 공간으로 끌어오지 않는 한 라인 경계를 넘어 일치할 수 없습니다.N

  3. 특정 양의 공백을 일치시키면 전체가 더 취약해집니다.

예를 들어 다음과 같이 할 수 있습니다.

sed '/<key>second<\/key>/ {N; s/\n[[:blank:]]*<array>/&\n\tinsert-me/;}' test.txt

또는 (더 자연스럽게) 사용대신에 걸어에스대안

sed -e '/<key>second<\/key>/ {N; /<array>/ a\\tinsert-me' -e ';}' test.txt
<record>
    <key>first</key>
    <array>
        --I want to insert the line here--
        <string>hello</string>
        <string>world</string>
        </array>
</record>
<record>
    <key>second</key>
    <array>
        insert-me
        <string>its</string>
        <string>me</string>
        <string>again</string>
        <string>hello</string>
        <string>world</string>
        <string>again</string>
    </array>
</record>

관련 정보