2013-08-01 8 views
35

Mam następujący plik testowysed - Komentując linię dopasowanie konkretny ciąg i że nie jest już wykomentowane

AAA 
BBB 
CCC 

stosując następujące sed mogę wypowiedzieć się na BBB linię.

# sed -e '/BBB/s/^/#/g' -i file 

Chciałbym tylko skomentować linię, jeśli jeszcze nie ma numeru # na początku.

# sed -e '/^#/! /BBB/s/^/#/g' file 

sed: -e expression #1, char 7: unknown command: `/' 

Jakieś pomysły, w jaki sposób mogę to osiągnąć?

Odpowiedz

54

Zakładając, że nie ma żadnych linii z wieloma # s to będzie działać:

sed -e '/BBB/ s/^#*/#/' -i file 

Uwaga: nie trzeba/g, ponieważ robisz co najwyżej jedno podstawienie jednej linii.

+0

To działało, dziękuję! –

+2

To zawsze wyedytuje pasującą linię, aby rozpocząć od pojedynczego #. Więc jeśli zaczyna się od trzech '# po tym poleceniu," wyczyści "je, aby zacząć od jednego' # '. Aby rozwiązać ten problem, jeśli jest to problem, po prostu zmień odpowiednio dopasowaną część (np. "Sed -e"/^ BBB/'...) –

+1

' sed '/^# BBB/"' masz na myśli. Ale jeśli BBB jest gdzieś pośrodku, to nie zadziała. Istnieje opcja zapisu "sed"/^ # /! {/ BBB/s/^/# /} "', który zadziała lepiej, ale moje początkowe rozwiązanie jest o wiele prostsze, o ile znasz jego ograniczenia. – aragaer

2

Uważam, że to rozwiązanie działa najlepiej.

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file 

Nie ma znaczenia, ile symboli "#" jest, nigdy nie doda kolejnego. Jeśli szukany wzorzec nie zawiera "#", doda go do początku wiersza, a także doda spację końcową.

Jeśli nie chcesz spacją

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\1/' file 
0

sed -i '/![^#]/ s/\(^.*BBB.*$\)/#\ \1/' file

to nie działa na mnie ze słowem kluczowym *.sudo żadnych uwag w ogóle ...

Ony składnia poniżej działa: sed -e '/sudo/ s/^#*/#/' file