Mam wiele plików, które chcę zaktualizować, zastępując jeden ciąg wieloliniowy innym ciągiem wieloliniowym. Coś w stylu:
* Some text,
* something else
* another thing
I chcę go zastąpić:
* This is completely
* different text
Rezultat byłby taki, że po zastąpieniu plik zawierający pierwszy blok tekstu będzie teraz zawierał drugi ciąg znaków (reszta pliku pozostanie niezmieniona).
Częścią problemu jest to, że muszę znaleźć listę plików do aktualizacji w systemie plików. Wydaje mi się, że mogę do tego użyć grep (choć znowu nie jest to tak łatwe w przypadku wieloliniowych łańcuchów), a następnie włożyć go w sed?
Czy jest na to łatwy sposób? Sed jest opcją, ale jest niewygodne, ponieważ muszę dodać \ n itp. Czy istnieje sposób, aby powiedzieć „weź dane wejściowe z tego pliku, dopasuj je w tych plikach, a następnie zastąp je treścią tego innego pliku”? W razie potrzeby mogę używać Pythona, ale chcę czegoś szybkiego i prostego, więc jeśli jest dostępne narzędzie, wolę go użyć niż napisać własny skrypt (co wiem, jak to zrobić).
some text, something else another thing
czy obejmuje wiele linii? A może chcesz tylko dopasowaćsome text,\nsomething else\nanotherthing
?Odpowiedzi:
Zastąp „Some ... \ n ... Thing” zawartością pliku „new” w jednym lub kilku plikach wejściowych
-i
bezpośrednio zmienić input.txt-p0
plik wejściowy slurp i wydrukuj go na końcus/regexp/.../s
w wyrażeniu regularnym.
jest.|\n
s/.../exp/e
zastąpiony przezeval(exp)
s/Some text\n...\n...thing\n/...
źródło
perl -i -p0e ' $b= `cat before`; s/$b/Some thing\n/se' input.txt ...
Obawiam się, że będzie ci trudno znaleźć rozwiązanie, które ci odpowiada, dopóki nie opracujesz konkretnego opisu problemu - ale do tego najlepiej nadaje się QA, tak jak ja to widzę. Być może da ci to pewien pomysł - zawsze będzie trzymał 3 linie w przestrzeni wzorca na raz - z 2-liniowym spojrzeniem w przód - jednocześnie przesuwając do przodu plik wejściowy tylko linię na raz.
Powinien być w stanie dopasować ciąg, niezależnie od tego, czy obejmuje wiele linii, czy nie - to znaczy do trzech. Ale nie ma żadnych przepisów dotyczących dublowania tego przepisu w zastępstwie - zawsze obejmuje on dwa wiersze, jak napisano.
źródło
Nie za mocny (bo nie sprawdzaj drugiego ciągu, ale łatwo go osiedlić) i może nie być zgodny z posix, ale bardzo prosty:
Pierwsze polecenie dodaje linie z jakiegoś tekstu, dopóki nie spotka się z inną rzeczą, a następnie druga linia zmienia go na inny tekst.
UWAGA Ograniczeniem jest to, że po każdym tekście zawsze powinna następować inna rzecz .
źródło