Muszę dodać następujący wiersz na końcu pliku konfiguracyjnego:
include "/configs/projectname.conf"
do pliku o nazwie lighttpd.conf
Chcę użyć sed
do tego, ale nie wiem, jak to zrobić.
Jak wstawiłbym go tylko wtedy, gdy linia jeszcze nie istnieje?
crudini
może być dobrą opcją (ale jeszcze nie dla lighthttpd)Odpowiedzi:
Po prostu nie komplikuj :)
grep + echo powinno wystarczyć:
-q
bądź cicho-x
dopasuj całą linię-F
wzór to zwykły ciągEdycja: włączone sugestie @cerin i @ thijs-wouters .
źródło
grep -vq ...
echo
do wyzwoleniacat
a wielowierszowego heredoc do pliku konfiguracyjnego.-s
aby zignorować błędy, gdy plik nie istnieje, tworząc nowy plik zawierający tylko tę linię.Byłoby to czyste, czytelne i wielokrotnego użytku rozwiązanie wykorzystujące
grep
iecho
dodające wiersz do pliku tylko wtedy, gdy jeszcze nie istnieje:Jeśli chcesz dopasować całą linię, użyj
grep -xqF
Dodaj,
-s
aby zignorować błędy, gdy plik nie istnieje, tworząc nowy plik zawierający tylko tę linię.źródło
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"
-
.--
polecenie grep, więc nie będzie już interpretować $ LINE zaczynającego się od myślnika jako opcji.Oto
sed
wersja:Jeśli twój ciąg jest w zmiennej:
źródło
sed -i -e '\|session.*pam_mkhomedir.so|h; ${x;s/mkhomedir//;{g;tF};a\' -e 'session\trequired\tpam_mkhomedir.so umask=0022' -e '};:F;s/.*mkhomedir.*/session\trequired\tpam_mkhomedir.so umask=0022/g;' /etc/pam.d/common-session
sed
lat, ale głównie po prostus
polecenie. Zamianyhold
ipattern
miejsca są poza mną.Jeśli piszesz do chronionego pliku, odpowiedzi @drAlberT i @ rubo77 mogą nie działać dla ciebie, ponieważ nie można sudo
>>
. Podobnie proste rozwiązanie zatem byłoby użycietee --append
(lub na MacOStee -a
)źródło
Jeśli pewnego dnia ktoś inny będzie musiał traktować ten kod jako „stary kod”, osoba ta będzie wdzięczna, jeśli napiszesz mniej egzotyczny kod, taki jak
źródło
innym rozwiązaniem seda jest zawsze dołączanie go do ostatniej linii i usuwanie wcześniej istniejącego.
„Właściwie zmieniona ucieczka” oznacza umieszczenie wyrażenia regularnego, które pasuje do twojego wpisu, tj. wymknięcie się wszystkim kontrolkom wyrażenia regularnego z twojego aktualnego wpisu, tj. umieszczenie ukośnika odwrotnego przed ^ $ / *? + ().
to może się nie powieść w ostatnim wierszu twojego pliku lub jeśli nie ma wiszącego nowego wiersza, nie jestem pewien, ale można sobie z tym poradzić przez sprytne rozgałęzienie ...
źródło
sed -i.bak -e '$a\' -e "$NEW_IP\t\t$HOST.domain\t$HOST" -e "/.*$HOST/d" /etc/hosts
sed -i -e '/<entry>/d; $a <entry>'
d
polecenie zrestartuje program seda i tym samym pominiea
ppend, jeśli usunięcie nastąpiło w ostatniej linii.a
ppend muszą być wykonywane przedd
suĹ:sed -i -e '$a<entry>' -e '/<entry>/d'
. To prawie to samo, co Twoja pierwotna odpowiedź.użyj awk
źródło
file file
ponieważ wykonuje dwa przejścia przez ten sam plik.NR==FNR
jest prawdziwe w pierwszym przebiegu, ale nie w drugim. To powszechny idiom w Awk.Odpowiedzi za pomocą grep są błędne. Musisz dodać opcję -x, aby dopasować całą linię, w przeciwnym razie wiersze takie jak
#text to add
będą nadal pasować, gdy chcesz dodać dokładnietext to add
.Więc poprawne rozwiązanie to coś takiego:
źródło
Korzystanie z seda: wstawi na końcu wiersza. Oczywiście możesz również przekazywać zmienne jak zwykle.
Korzystanie z oneliner sed
Używanie echa może nie działać w systemie root, ale będzie działać w ten sposób. Ale nie pozwoli ci zautomatyzować rzeczy, jeśli chcesz to zrobić, ponieważ może poprosić o hasło.
Miałem problem, gdy próbowałem edytować z poziomu roota dla konkretnego użytkownika. Samo dodanie
$username
poprzedniego było dla mnie poprawką.źródło
Musiałem edytować plik z tak ograniczonymi uprawnieniami do zapisu
sudo
. działając na podstawie odpowiedzi ghostdog74 i używając pliku tymczasowego:źródło