Działa to tylko w przypadku bardzo prostych linii. W przeciwnym razie grep interpretuje większość znaków innych niż alfa w twoim wierszu jako wzorce, powodując, że nie wykrywa wiersza w pliku.
Piękne rozwiązanie. Oczywiście działa to również w przypadku wyzwalania bardziej skomplikowanych wyrażeń. Mój używa the echodo wyzwolenia cata wielowierszowego heredoc do pliku konfiguracyjnego.
W przypadku polecenia, które zastępuje częściowy ciąg pełnym / zaktualizowanym wpisem w pliku konfiguracyjnym lub dodaje wiersz w razie potrzeby: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
Chciałbym zobaczyć objaśnienie tego rozwiązania z adnotacjami. Używam od sedlat, ale głównie po prostu spolecenie. Zamiany holdi patternmiejsca 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życie tee --append(lub na MacOS tee -a)
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
grep -q -F 'include "/configs/projectname.conf"' lighttpd.conf
if [ $? -ne 0 ]; then
echo 'include "/configs/projectname.conf"' >> lighttpd.conf
fi
Przepraszamy, jeśli nie znasz powłoki, przejdź do administrowania systemem Windows. Rozwiązania wykorzystujące && i || to normalna składnia powłoki i powinna być zrozumiała dla każdego kompetentnego administratora. W ogóle nie ma tam nic ezoterycznego.
Dzięki za komentarz Graham! Tak, to normalna składnia powłoki. I tak, każdy kompetentny administrator powinien to zrozumieć. Jednak działa jako taki w oparciu o efekt uboczny algorytmu oceny wyrażeń w powłoce. Możesz więc nazwać to wszystko, co lubisz, z wyjątkiem prostych - co było moim pierwotnym celem.
innym rozwiązaniem seda jest zawsze dołączanie go do ostatniej linii i usuwanie wcześniej istniejącego.
sed -e '$a\' -e '<your-entry>' -e "/<your-entry-properly-escaped>/d"
„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 ...
Ładny, jednoliniowy, krótki i łatwy do odczytania. Działa świetnie przy aktualizowaniu etc / hosts:sed -i.bak -e '$a\' -e "$NEW_IP\t\t$HOST.domain\t$HOST" -e "/.*$HOST/d" /etc/hosts
@Jezz Myślę, że to się nie powiedzie, jeśli wpis znajduje się już na końcu pliku, ponieważ dpolecenie zrestartuje program seda i tym samym pominie append, jeśli usunięcie nastąpiło w ostatniej linii.
Dzieje się tak, file fileponieważ wykonuje dwa przejścia przez ten sam plik. NR==FNRjest 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 addbędą nadal pasować, gdy chcesz dodać dokładnie text to add.
Korzystanie z seda: wstawi na końcu wiersza. Oczywiście możesz również przekazywać zmienne jak zwykle.
grep -qxF "port=9033" $light.conf
if [ $? -ne 0 ]; then
sed -i "$ a port=9033" $light.conf
else
echo "port=9033 already added"
fi
Korzystanie z oneliner sed
grep -qxF "port=9033" $lightconf || sed -i "$ a port=9033" $lightconf
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 $usernamepoprzedniego było dla mnie poprawką.
grep -qxF "port=9033" light.conf
if [ $? -ne 0 ]; then
sudo -u $user_name echo "port=9033" >> light.conf
else
echo "already there"
fi
Używamy plików cookie i innych technologii śledzenia w celu poprawy komfortu przeglądania naszej witryny, aby wyświetlać spersonalizowane treści i ukierunkowane reklamy, analizować ruch w naszej witrynie, i zrozumieć, skąd pochodzą nasi goście.
Kontynuując, wyrażasz zgodę na korzystanie z plików cookie i innych technologii śledzenia oraz potwierdzasz, że masz co najmniej 16 lat lub zgodę rodzica lub opiekuna.
crudini
może być dobrą opcją (ale jeszcze nie dla lighthttpd)