Mam plik tekstowy ( devel.xml
).
Dodałem do niego słowo REPLACETHIS, aby zastąpić ten ciąg treścią w innym pliku ( temp.txt
).
Mam najbliższą rzecz:
sed -i -e "/REPLACETHIS/r temp.TXT" -e "s///" devel.txt;
Spowoduje to wstawienie treści po ciągu, a następnie usunięcie ciągu.
Czy to najlepszy sposób, aby to zrobić?
text-processing
sed
perl
RafaelGP
źródło
źródło
Odpowiedzi:
To, co zrobiłeś, to usunąć
SUBSTITUTETHIS
gdziekolwiek pojawi się w pliku (ale nie resztę wiersza, w którym się pojawia) i wstawić zawartośćtemp.TXT
poniżej tego wiersza. JeśliSUBSTITUTETHIS
pojawia się wiele razy w wierszu, usuwane jest tylko pierwsze wystąpienie itemp.TXT
dodawana jest tylko jedna kopia .Jeśli chcesz zastąpić cały wiersz, gdy się
SUBSTITUTETHIS
pojawi, użyjd
polecenia. Ponieważ musisz biegać zarówno, jakr
id
gdy jest mecz, umieść je w przygotowanej grupie.Niektóre implementacje sed pozwalają używać średników do oddzielania poleceń i całkowicie pomijają separatory wokół nawiasów klamrowych, ale nadal potrzebujesz nowej linii, aby zakończyć argument
r
polecenia:Jeśli chcesz zastąpić
SUBSTITUTETHIS
zawartością pliku, ale zachować to, co jest przed i po nim w wierszu, jest to bardziej skomplikowane. Najprostszą metodą jest włączenie zawartości pliku do polecenia sed; pamiętaj, że będziesz musiał poprawnie zacytować jego zawartość.Lub użyj Perla. Jest to krótkie, ale działa
cat
raz dla każdej zmiany:Aby raz odczytać plik po uruchomieniu skryptu i unikać zależnie od polecenia powłoki:
(przedstawione w dwóch liniach dla czytelności, ale można pominąć podział linii). Jeśli nazwa pliku jest zmienna, aby uniknąć problemów z cytowaniem, przekaż ją do skryptu za pomocą zmiennej środowiskowej:
źródło
cat temp.txt
móccat ${variable}
?-0777
przełącznika do slurp w całym pliku i regularneopen
:perl -0777 -pe 'BEGIN {open F, q(temp.TXT); $r=<F>; chomp($r)} s/SUBSTITUTETHIS/$r/ge' -i devel.txt
r temp.TXT
wiadomości typu „BEGIN temp.TXT”, „END temp.TXX”a
(dodaj). grymoire.com/Unix/Sed.html#uh-36