W przypadku pojedynczego pliku wejściowego zawierającego tylko komentarze (zaczynające się od #) i ZMIENNE = wiersze wartości, czy można zastąpić wartość jednej zmiennej, jeśli zostanie znaleziona, a w przeciwnym razie dołączyć parę na końcu pliku, jeśli nie zostanie znaleziona?
Moja obecna metoda polega na usunięciu jej w pierwszym przejściu, a następnie dołączeniu jej na końcu pliku w drugim przejściu, ale ta metoda mierzy kolejność wierszy (i są to również dwa różne polecenia):
sed -r "/^FOOBAR=.*$/d" -i samefile &&
sed -r "$ a\FOOBAR=newvalue" -i samefile
Czy można to zrobić, tj. utrzymywanie kolejności linii, w jednej linii sed? Jeśli zrobi to jakiś inny program narzędziowy (awk, ...), przejmę to.
źródło
newvalue
było przechowywane w zmiennej?sed "/^${varName}=/{h;s/=.*/=${varValue}/};\${x;/^$/{s//${varName}=${varValue}/;H};x}" ${VARFILE}
ze zmiennymi, podwójnymi cudzysłowami, aby umożliwić podstawienie zmiennych i unikanie$
$$varName
sed "/^${varName}=/{h;s/=.*/=${!varName}/};\${x;/^$/{s//${varName}=${!varName}/;H};x}" ${VARFILE}
Można to prawdopodobnie skrócić. To nie jest pojedyncza komenda sed, a także używa grep, ale wydaje się, że jest to zasadniczo to, czego chcesz. Jest to pojedynczy wiersz i służy do edycji pliku w miejscu (bez plików tymczasowych).
źródło
Oto prostsze
sed
podejście, ponieważ nie jest mised
hold space
łatwo pracować. Jeśli czujesz się komfortowohold space
, użycie metody don_crissti daje dodatkową możliwość zachowania czegokolwiek z istniejącej linii, ale zwykle jest to bardzo rzadkie.W tym podejściu wystarczy wydrukować wszystko oprócz linii, którą chcesz upuścić, a następnie na końcu dołączyć zamiennik.
źródło
Opierając się na innych odpowiedziach, jeśli to, co chcesz zrobić, to zastąpić wartość zmiennej, jeśli ta zmienna jest obecna w pliku, i dołączyć ją na końcu pliku, jeśli nie jest (co nie robi twoich
sed
poleceń) mógłbym spróbować:źródło
W awk jest to trochę łatwiejsze, chociaż „edycja na miejscu” nie jest automatyczna:
źródło
Po prostu użyj
grep
i,echo
aby utworzyć pusty rekord:Każda linia ucieka z kodem błędu zero.
źródło
grep
iecho
Właściwie działa z następującymi:
sed -i '/^FOOBAR=/{h;s/=.*/=newvalue/};${x;/^$/{s//FOOBAR=newvalue/;H};x}' infile
W odpowiedzi wybrano -i brakuje.źródło
aby to zrobić za pomocą Perla i na miejscu, działa to dobrze dla mnie:
źródło
grep
aecho
iperl
zamiast robić wszystkoperl
? Czy piszesz do pliku (>> my.file
) podczas jego czytania (grep my.file
)?