sed를 사용하여 전체 줄을 문자가 포함된 다른 줄로 바꾸는 방법

sed를 사용하여 전체 줄을 문자가 포함된 다른 줄로 바꾸는 방법

파일의 19행에 다음이 포함되어 있습니다.

send -- "[email protected]\r"

이메일을 바꾸고 싶어서 고민하다가 이렇게 하게 됐어요

sed -i.bak '19s/.*/send -- "[email protected]\r"/' ./a

19번째 줄이 바뀌었지만 내가 얻는 것은

"end -- "[email protected]

무엇이 잘못되었으며 어떻게 해결하나요?

답변1

백슬래시는 패턴의 이스케이프 문자 sed이므로오자캐리지 리턴이 삽입되었습니다. 당신이 원하는 것은 \\r이스케이프 백슬래시 뒤에 리터럴이 오는 것 입니다 r.

답변2

검색하여 바꾸는 대신 19번째 줄만 변경할 수 있습니다.

sed '19c\send -- "[email protected]\\r"'

답변3

필요 이상으로 이 작업이 더 어려워지고 있습니다. 전체 줄이 아닌 이메일 주소만 변경하면 됩니다. 시연하려면:

$ echo 'send -- "[email protected]\r"'  | sed 's/old@example\.com/[email protected]/'
send -- "[email protected]\r"

그런데, 검색 패턴이 한 줄에 두 번 이상 나타날 수 있는 경우 g명령 명령 끝에 (전역) 수정자를 선택적으로 사용할 수 있고/또는 대소문자를 구분하지 않는 검색을 원하는 경우 (대소문자 무시) 수정자를 사용할 수 있습니다. 둘 다 사용하십시오: .s///is/old@example\.com/[email protected]/ig

어쨌든 명령은 다음과 같습니다.

sed -i.bak '19s/old@example\.com/[email protected]/' ./a

변경할 정확한 줄 번호를 몰랐다면 줄 번호 대신 줄 주소로 정규 표현식을 지정하세요.

sed -i.bak '/^send.*old@example\.com/ s/old@example\.com/[email protected]/' ./a

모든 항목을 변경하는 것이 훨씬 더 쉽습니다.[이메일 보호됨]파일에서 주소를 지정하지 않아도 파일의 모든 줄에서 대체가 발생합니다.

sed -i.bak 's/old@example\.com/[email protected]/' ./a

관련 정보