sed s///(빈 패턴 및 교체)가 특정 문자열을 삭제하는 이유는 무엇입니까?

sed s///(빈 패턴 및 교체)가 특정 문자열을 삭제하는 이유는 무엇입니까?

Junk.txt와 Lines.txt라는 두 개의 파일이 있습니다.

$>cat junk.txt
This is a junk text
$>cat lines.txt
Line1
Line2
Line3
Line4

sed다음 스크립트를 실행하면

 sed -i -e  "/Line3/r junk.txt" -e "s///" lines.txt

나는 다음과 같은 결과를 얻습니다.

Line1
Line2

This is a junk text
Line4

보시다시피, Line3그것은 더 이상 존재하지 않습니다. 좋아요, 이 /Line3/r junk.txt부분은 line.txt에서 Line3과 일치하는 텍스트를 찾아junk.txt의 내용을 추가합니다. 그런데 왜 s///이 명령은 일치하는 줄을 완전히 제거합니까?

솔직히 이것이 나에게 필요한 행동인데 왜 이런 일이 일어나는지 알고 싶습니다.

답변1

s빈 정규 표현식으로 편집 명령을 호출하면 가장 최근에 사용한 표현식이 재사용됩니다. 이 경우 Line3이전 일치 항목을 재사용합니다. 이는 //(빈 정규식) 명령 및 주소 범위에 작동합니다.s

이 기능이 없으면 명령을 다음과 같이 작성할 수도 있습니다.

sed -i -e '/Line3/r junk.txt' -e 's/Line3//' lines.txt

텍스트 Line3가 교체되지 않았기 때문에 삭제되었습니다.

가끔 이런 구조를 볼 수 있습니다.

/expression/ {
    s//replacement/
    # other code here
}

이것POSIX 사양sed로 표현하다

RE가 비어 있으면(즉, 모드가 지정되지 않은 경우) sed는 마지막으로 적용된 명령에 사용된 마지막 RE가 지정된 것처럼(주소 또는 대체 명령의 일부로) 동작해야 합니다.

관련 정보