sed - jak wykonać kilka kolejnych podmiany, ale przetwarzać plik tylko raz?


31

Jeśli wykonuję kilka zmian, które muszą być następujące po sobie, np

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 

Czy istnieje lepszy sposób na zrobienie tego, który przejdzie tylko przez plik t1_spec.file i wykona 4 podstawienia dla każdej linii, zamiast przechodzić przez plik 4 razy?

Odpowiedzi:


43

Oprócz używania średników możesz także podać sedowi więcej niż jedno wyrażenie, używając -eflagi:

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

14

W GNU (np. Na moim komputerze Ubuntu) po prostu używanie wielu linii jest obsługiwane i działa dobrze i wygląda dobrze (imho), ponieważ pozwala uniknąć bardzo długich linii, np.

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

5

Możesz użyć średników do oddzielenia różnych podstacji między pojedynczymi cudzysłowami lub możesz umieścić wszystkie te polecenia w pliku i określić plik z -fopcją sed.

Korzystanie z pliku jest szczególnie przydatne, jeśli zamierzasz używać tego samego zestawu sedpoleceń w kółko. Kiedyś miałem do czynienia z brudnym plikiem danych i z czasem skończyło się na tym, że plik 88 linii został wywołany, massage.sedaby automatycznie usunąć większość typowych błędów, które popełniłem z pliku danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.