![sed s///(빈 패턴 및 교체)가 특정 문자열을 삭제하는 이유는 무엇입니까?](https://linux55.com/image/155758/sed%20s%2F%2F%2F(%EB%B9%88%20%ED%8C%A8%ED%84%B4%20%EB%B0%8F%20%EA%B5%90%EC%B2%B4)%EA%B0%80%20%ED%8A%B9%EC%A0%95%20%EB%AC%B8%EC%9E%90%EC%97%B4%EC%9D%84%20%EC%82%AD%EC%A0%9C%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
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가 지정된 것처럼(주소 또는 대체 명령의 일부로) 동작해야 합니다.