Próbuję zastąpić ścieżkę w pliku wejściowym.
#include "../../../Plumed.h" #### this is old patch in input
#include "/usr/local/include/Plumed.h #### this should be the new path
Po zapoznaniu się z wcześniej udzielonym pytaniem ( https://stackoverflow.com/questions/11245144/replace-whole-line-containing-a-string-using-sed ).
Próbowałem tego.
sed -i '/../../../Plumed.h/c\/usr/local/include/Plumed.h' ../dist0.xvg
perl -i -pe 's/../../../Plumed.h/usr/local/include/Plumed.h/g' ../dist0.xvg
Wierzę, że sed / perl się myli, ale nie jestem pewien, jak to rozwiązać. Każda pomoc będzie mile widziana.
Odpowiedzi:
Jeśli używasz
/
jako ogranicznikased
, rozwiązaniem może być:lub możesz użyć innego ogranicznika niż
/
, na przykład:
:Innym sposobem jest
awk
:źródło
tl, dr:
Posługiwać się:
Kilka komentarzy na temat Twojej próby Sed:
-i
nie jest przenośny, więc wygląda na to, że używasz GNU Sed.BSD Sed ma również
-i
przełącznik, ale rozszerzenie kopii zapasowej jest wymaganym argumentem, więc modyfikacja pliku bez zapisywania kopii zapasowej w BSD Sed wymaga-i ''
.Inne wersje Sed mogą
-i
w ogóle nie mieć przełącznika.Wyrażenie regularne tutaj
/../../../Plumed.h/
zawiera wiele kopii ogranicznika wyrażenia regularnego.Typowym rozwiązaniem tego problemu jest uniknięcie separatora:
Jest jednak mało znany fakt o Sed, że możesz użyć dowolnego znaku do ogranicznika wyrażenia regularnego (nie tylko w
s
poleceniu), jeśli odwrócisz ukośnik w pierwszej instancji. (Cóż, prawie każda — ukośnik odwrotny lub nowa linia jest niedozwolona).Aby bezpośrednio zacytować specyfikacje POSIX :
Aby uniknąć „zespołu pochylonych wykałaczek”, zauważ, że następujące dwa wyrażenia regularne są równoważne:
Zauważ, że powiedziałem „odpowiednik” nie poprawne. To prowadzi mnie do następnego punktu, pominiętego w każdej innej odpowiedzi:
Kropka (
.
) w wyrażeniu regularnym oznacza dowolną postać .Jeśli chcesz dopasować tylko literał, możesz albo uciec z kropki odwrotnym ukośnikiem, albo wkleić go do klasy postaci jak w
[.]
.Zatem, aby dopasować tylko okresy dosłowne, wyrażenie regularne powinno być bardziej podobne do:
Tyle o unikaniu pochylonych wykałaczek.
Możesz także użyć prawdopodobnie bardziej czytelnej formy:
c
Polecenie zmienia całą linię , a nie tylko część linii dopasowane regex.Użyj
s
polecenia, aby zmienić tylko część linii.W szczególności dzięki
s
poleceniu nie musisz uciekać od pierwszego separatora wyrażenia regularnego (nawet w przypadku niezwykłego znaku używanego jako separator), tak jak w przypadku używania alternatywnego separatora w adresie.Co się tyczy
c
polecenia, warto wiedzieć, że umieszczenie nowego tekstu w tym samym wierszu coc\
rozszerzenie GNU jest nieprzenośne.Podsumowując, możesz użyć
s
polecenia w następujący sposób:Lub, jeśli chcesz być jeszcze bardziej wyraźny, możesz użyć zakotwiczonego wyrażenia regularnego i
c
komendy hange, aby zmienić tylko całą linię:źródło
To polecenie działało dla mnie:
źródło
Użyj wykrzyknika, jeśli w tekście jest wiele ukośników:
źródło