sed - 여러 개의 연속 대체를 수행하지만 파일을 한 번만 처리하는 방법은 무엇입니까?

sed - 여러 개의 연속 대체를 수행하지만 파일을 한 번만 처리하는 방법은 무엇입니까?

예를 들어 연속 교체가 필요한 여러 교체를 수행하려는 경우

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/' t1_spec.rb
sed -i '/expect(browser.*\.should/s/\.should/).should/' t1_spec.rb
sed -i 's/\.should/\.to/' t1_spec.rb 
sed -i 's/==/eq/' t1_spec.rb 

t1_spec.file을 한 번만 반복하고 파일을 4번 반복하는 대신 줄당 4번의 교체를 수행하는 더 좋은 방법이 있습니까?

답변1

세미콜론을 사용하는 것 외에도 flags를 사용하여 sed에 여러 표현식을 제공할 수 있습니다 -e.

sed -i -e 's/expr1/replace1/' -e 's/expr2/replace2/'  t1_spec.rb 

답변2

세미콜론을 사용하여 작은따옴표 사이의 다른 대체 문자를 구분할 수 있습니다.

sed -i 's/foo/bar/;s/abc/def/' t1_spec.rb

-f아니면 이 모든 명령을 파일 에 넣고 sed.

sed -i -f my_sed_commands t1_spec.rb

이 파일은 동일한 명령 세트를 계속해서 사용 하려는 경우 sed특히 유용합니다 . 나는 한때 더러운 데이터 피드를 처리해야 했고 시간이 지남에 따라 massage.sed피드에서 얻은 대부분의 일반적인 오류를 자동으로 정리하기 위해 호출된 88줄 파일을 갖게 되었습니다 .

답변3

GNU(예: 내 Ubuntu 시스템)에서는 단순히 여러 줄을 사용하는 것이 지원되며 이는 여러 교체를 의미한다고 추론됩니다. 예를 들어 매우 긴 줄을 피하기 때문에 잘 작동하고 보기에도 좋아 보입니다(IMHO).

sed -i '/^[[:space:]]*browser.*\.should/s/browser/expect(browser/
        /expect(browser.*\.should/s/\.should/).should/
        s/\.should/\.to/
        s/==/eq/' t1_spec.rb 

관련 정보