2010-11-22 4 views

답변

1
sed -i 's/third//g' my.txt 

의 끝까지 루프에 있어야합니다. 당신은

+2

이 줄을 삭제하지 않습니다, 그냥 빈 문자열과 '세 번째'대체합니다. –

+0

@Sean : 실제로; 나는 그 질문을 잘못 읽은 것 같다. –

2

을 수행 할 수 있습니다 GNU가 나오지 사용

sed -i -r '/^(third|)$/d' my.txt 
+0

표준 (POSIX) 'sed'가 지원하지 않는 확장 정규 표현식을 사용합니다. 그것은 틀린 것이 아닙니다. 이것은 단지 확장되어야 할 부분입니다. –

4

는 덮어 쓰기가 '-i'옵션을 사용하여 간단하다; 표준 sed를 사용하면 임시 파일에 쓰고 원본 파일에 복사해야합니다.

다른 답변은 질문에서 '공백 라인'요건을 충족하지 못합니다.

sed -i '/third/d;/^[ ]*$/d' my.txt 

명령의 첫 번째 부분은 세미콜론까지 'third'를 찾아 일치하는 줄을 삭제합니다. 명령의 두 번째 부분은 0 개 이상의 공백으로 구성된 행을 찾아 삭제합니다. 공백과 탭이있는 행을 삭제하려면 문자 클래스에 탭을 추가하십시오. SO 마크 업 언어로 탭을 표시하는 편리한 방법이 없습니다.

당신은 동등하게 작성할 수

sed -i -e '/third/d' -e '/^[ ]*$/d' my.txt 

그리고 비 GNU에 대한

가 나오지도, 당신이 사용하는 것 :

sed '/third/d;/^[ ]*$/d' my.txt > x.$$ 
cp x.$$ my.txt 
rm -f x.$$ 
+0

GNU sed가 없다면, 다른 방법은 일반'ed'를 사용하는 것입니다. 명령은 동일하지만 전체 구문은 다릅니다. – mouviciel

+0

문자 클래스 ('[\ t]')에서'\ t'를 사용하거나'[[: blank :]]'(공백이나 탭)이나'[[: space :]]'(POSIX locale : space, tab, newline, carriage return, form feed, vertical tab. 마지막 예제에서는'sed ... && cp ...'를 실행하는 것이 더 좋으므로 원본 파일은'sed' –

+0

@Dennis : GNU sed에 대해서는''\ t''에 대해 아마 맞을 것이지만, POSIX 표준은이를 인식하지 못하고 명령을 내리지도 않으며, Solaris 10도 (GNU sed가 표면적으로 솔라리스 10 sed는 '[: blank :]] 등을 인식하는 것 같지만, 행동하지 않는 것 같습니다. 모든 세계는 GNU를 사용하지 않습니다. 조건부 사본에 대해 당신이 맞습니다. –

0

sed 그것이 스트림 편집 할 수있는 스트림 편집기, 즉이다 (파이프) 파일이 아닙니다. 당신이 파일을 편집 할 경우, 당신은 ed 같은 파일 편집기를 사용한다 :

ed my.txt <<-HERE 
    ,g/^third$/d 
    ,g/^$/d 
    w 
    q 
HERE 
+0

글로벌 명령을 앞서는 쉼표의 의미는 무엇입니까? –

+0

@Jonathan Leffler : 주소입니다. 'a, b'는 "a에서'a ' 라인'b' ". 'a'의 기본값은'1'이고'b'의 기본값은'$'입니다, 즉 마지막 줄입니다. Ergo,', '는 "1 행에서 마지막 행"으로, 전체 파일을 IOW로 의미합니다. 'ed'는 파일 편집기이기 때문에 파일에서 실제로 움직일 수 있습니다. 따라서 모든 명령은 주소를 취합니다. 'sed' OTOH는 일반적으로 스트림으로 거꾸로 갈 수 없기 때문에 OTOH가 그렇게 할 수있을 것이라고 기대할 수 없습니다. –

+0

OK : 당신이 달리 지정하지 않는 한 전역 검색의 범위가 전체 파일이기 때문에 나는 항상'g/^ third $/d'를 사용했습니다. 'x'로 시작하는 이전 줄로 'z'로 시작하는 다음 줄로 작업을 제한하려면 '?^x?,/^ z/g/^ third $/d'와 같이 입력하십시오. 그러나 쉼표를 추가하는 것은 나에게 발생하지 않았다. 그리고 내가 아마 'ed'를 사용할 때 그 특별한 경우에는 가지 않을 것이다. –

관련 문제