Jak mogę zamienić tekst po określonym słowie za pomocą sed?

12

Mam plik o nazwie .ignore. W razie potrzeby wymienić projdir. Na przykład:

ignore \..*
ignore README
projdir Snake

Muszę zastąpić Snake'a na przykład „PacMan”. Czytam stronę podręcznika, ale nie mam pojęcia, co robić.

Jakub Baski Gabčo
źródło

Odpowiedzi:

18

Wyszukaj wiersz zaczynający się od projdiri zamień cały wiersz na nowy:

sed -i 's/^projdir .*$/projdir PacMan/' .ignore

^i $są znacznikami początku / końca linii, więc wzór będzie pasował do całej linii; .*pasuje do wszystkiego. -iMówi sednapisać bezpośrednio do zmian .ignore, a nie tylko ich wyprowadzania

Michał Mrożek
źródło
Jeśli użyjesz długiej opcji dla -i, która jest, --in-placewówczas przykład będzie bardziej samowydajny.
Elijah Lynn
5

Jednym z podejść jest przepisanie całej linii przy użyciu odwołań wstecznych dla części, które chcesz zachować:

sed -e 's/^\( *projdir  *\)[^ ]*\(.*\)*$/\1PacMan\2/'

Innym podejściem jest przepisanie tej części linii, ale tylko wtedy, gdy jakaś inna część pasuje:

sed -e '/^ *projdir / s/ [^# ]/ PacMan/'

Oba przykłady przepisują drugie słowo rozdzielane spacjami w wierszach, w których znajduje się pierwsze słowo projdir.

Gilles „SO- przestań być zły”
źródło
3

Chociaż jest to stary post i wydaje się, że została rozwiązana przez zaakceptowaną odpowiedź, faktyczne pytanie nie zostało udzielone. Aby uzyskać kompletność i pomóc innym:

Tutaj odpowiedź, która faktycznie pasuje do „Węża”, a nie do linii zaczynających się na „projdir” ...

sed -r 's/(^.*)Snake/\1PacMan' .ignore

Zastępuje to wszystko od początku linii, w tym „Snake” wszystko przed „Snake” + „PacMan”. \ 1 oznacza to, co jest dopasowane w środku (). Wszystko po „Wężu” pozostaje nietknięte.

Moritz
źródło
1
sed -i 's:^projdir.*$:projdir PacMan:g' .ignore

^ projdir to znalezienie linii zaczynającej się od łańcucha projdir. Tam. * $ Oznacza ciąg po projdir w linii tej samej linii. Ciąg projdir PacMan to ciąg, który zastępujemy. g jest dla globalnego - aby zastąpić wszystkie takie linie zaczynające się od projdir. .ignore to nazwa pliku

Tinu
źródło
1
Czy możesz rozszerzyć swoją odpowiedź i wyjaśnić, co jest?
Romeo Ninov
Odpowiedzi są znacznie bardziej przydatne, jeśli zawierają wyjaśnienia dotyczące tego, jak i dlaczego działa polecenie lub fragment kodu.
Anthony Geoghegan
Mam nadzieję, że jest to bardziej przydatne po edycji
Tinu