2014-12-03 1 views
0

나는 #로 시작하고 난 다음 스크립트를 시도, 라인은 #로 시작 패턴

# 127.0.0.1  localhost 
# ::1    localhost 

127.0.0.1  localhost   <---- line I want to delete 
127.0.0.2  abcabc 

파일에서 패턴 로컬 호스트와 일치하지 않는 줄을 삭제하는 것을 시도하고 일치하지 않는 삭제 그러나 작동하지 않습니다.

sed -i "/^[^#](.*)localhost$/d" /etc/hosts 

sed -i "/^([0-9]{1,3}\.){3}[0-9]{1,3}/d" /etc/hosts 

줄을 어떻게 지울 수 있습니까?

답변

1

기본값 sed는 캡쳐 그룹이 아닌 리터럴 문자로 ()을 사용합니다.

sed -i "/^[^#].*localhost$/d" /etc/hosts 

또는

sed -i "/^[^#].* \+localhost.*$/d" /etc/hosts 

문자열 localhost에 바로 뒤에 제시 할 공간의 몇 가지 가능성이있을 수 있습니다, 그래서 내가 위의 명령에서 문자열 localhost 옆에 .*을 추가했습니다.

예 :

$ cat file 
# 127.0.0.1  localhost 
# ::1    localhost 

127.0.0.1  localhost 
127.0.0.2  abcabc 
$ sed "/^[^#].*localhost$/d" file 
# 127.0.0.1  localhost 
# ::1    localhost 

127.0.0.2  abcabc 
+0

또는이 작동 –

+0

file''나오지도 "/^[^#].*[[:space:]]\+localhost$/d".. 감사합니다. .... – noufalcep

+0

다행스럽게 생각합니다. –

0
"/^[^#]*localhost$/d" 

당신은 단순히 필요한 줄을 삭제하는 sed에 인수로 사용할 수 있습니다.

0
awk '/localhost/ && !/#/ {next} 1' 

결과

# 127.0.0.1  localhost 
# ::1    localhost 

127.0.0.2  abcabc 
+2

'!/^ # /'를 사용하여 주석이 줄의 시작에 있음을 알리십시오. 'awk '외의 것은 간단하고 이해하기 쉽습니다 :'localhost'로 모든 라인을 건너 뛰고'#' – Jotne