sed가 여러 교체가 처음 발생한 경우에만 전역적으로 교체하는 이유는 무엇입니까?

sed가 여러 교체가 처음 발생한 경우에만 전역적으로 교체하는 이유는 무엇입니까?

다음과 같이 모든 \n개행 문자를 이스케이프 시퀀스로 바꾸고 모든 작은 따옴표 문자를 \n그 중 두 개로 전역적으로 바꾸고 싶습니다 .'''

function esc_foobar {
    # Escapes any "'" single quotation character.
    local -r esc_quot="s:':'':g"
    # Escapes any "\n" new line character.
    local -r esc_nl=':a;N;$!ba;s:\n:\\n:g'
    # Escape everything in one sed run.
    sed -- "$esc_quot;$esc_nl" foobar.txt
}

파일에 다음이 포함되어 있다고 가정할 때 foobar.txt:

Foo's bar
Bar's foo

첫 번째 '작은따옴표 문자만 두 배가 됩니다.

명령에서 및 대체의 순서를 바꾸면 esc_quot작동합니다. 즉, 모든 작은따옴표 문자가 예상대로 두 배가 됩니다.esc_nlsed$esc_nl;$esc_quot'

왜 그럴까요?

답변1

Sed를 자세히 살펴보고 구체적으로 Sed의 N명령을 이해하려고 노력한 후 나에게 적합한 다음과 같은 작은 Sed 스크립트를 생각해 냈습니다.

sed -- '$!N;s:\n:\\n:g;'"s:':'':g"

내 질문에 있는 Sed 스크립트의 두 번째 변형에는 입력이 홀수 줄인 경우 마지막 줄을 변경하지 않고 그대로 두는 문제가 있습니다.

관련 정보