Ich muss die folgende Zeile am Ende einer Konfigurationsdatei hinzufügen:
include "/configs/projectname.conf"
zu einer Datei namens lighttpd.conf
Ich sed
möchte dies verwenden, kann aber nicht herausfinden, wie.
Wie würde ich es nur einfügen, wenn die Zeile noch nicht existiert?
crudini
möglicherweise eine gute Option (aber noch nicht für lighthttpd)Antworten:
Halte es einfach :)
grep + echo sollte ausreichen:
-q
Sei ruhig-x
passen die ganze Linie-F
Muster ist eine einfache ZeichenfolgeBearbeiten: @cerin und @ thijs-wouters Vorschläge aufgenommen .
quelle
grep -vq ...
echo
, um einencat
mehrzeiligen Heredoc in eine Konfigurationsdatei auszulösen .-s
, um Fehler zu ignorieren, wenn die Datei nicht vorhanden ist, und eine neue Datei mit nur dieser Zeile erstellen.Dies wäre eine saubere, gut lesbare und wiederverwendbare Lösung mit
grep
undecho
eine Zeile in eine Datei nur hinzufügen , wenn es nicht bereits vorhanden ist :Wenn Sie die gesamte Linie anpassen müssen, verwenden Sie
grep -xqF
Hinzufügen
-s
, um Fehler zu ignorieren, wenn die Datei nicht vorhanden ist, und eine neue Datei mit nur dieser Zeile erstellen.quelle
sudo grep -qF "$LINE" "$FILE" || echo "$LINE" | sudo tee -a "$FILE"
-
.--
den Befehl grep hinzugefügt , damit eine mit einem Bindestrich beginnende $ LINE nicht mehr als Optionen interpretiert wird.Hier ist eine
sed
Version:Wenn sich Ihre Zeichenfolge in einer Variablen befindet:
quelle
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
jahrelang aber meistens nur dens
Befehl benutzt. Diehold
undpattern
Space Swaps sind mir ein Rätsel.Wenn Sie in eine geschützte Datei schreiben, funktionieren die Antworten von @drAlberT und @ rubo77 möglicherweise nicht für Sie, da man nicht sudo kann
>>
. Eine ähnlich einfache Lösung wäre dann die Verwendungtee --append
(oder unter MacOStee -a
):quelle
Wenn ein Tag jemand anderes hat mit diesem Code als „Legacy - Code“ beschäftigen, dann wird dieser Person dankbar sein , wenn Sie einen weniger exoteric Code schreiben, wie
quelle
Eine andere Lösung besteht darin, sie immer an die letzte Zeile anzuhängen und eine bereits vorhandene zu löschen.
"ordnungsgemäß maskiert" bedeutet, einen Regex einzufügen, der Ihrem Eintrag entspricht, dh alle Regex-Steuerelemente aus Ihrem tatsächlichen Eintrag zu entfernen, dh einen Backslash vor ^ $ / *? + () zu setzen.
Dies könnte in der letzten Zeile Ihrer Datei fehlschlagen, oder wenn es keine baumelnde neue Zeile gibt, bin ich mir nicht sicher, aber das könnte durch eine raffinierte Verzweigung behoben werden ...
quelle
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
Befehl das sed-Programm neu startet und dadurch dasa
ppend überspringt , wenn sich das Löschen zufällig in der letzten Zeile befindet.a
ppend müssen vord
elete ausgeführt werden :sed -i -e '$a<entry>' -e '/<entry>/d'
. Es ist fast das gleiche wie Ihre ursprüngliche Antwort.benutze awk
quelle
file file
daran, dass zwei Durchgänge über dieselbe Datei ausgeführt werden.NR==FNR
ist wahr beim ersten Durchgang, aber nicht beim zweiten. Dies ist eine verbreitete Awk-Sprache.Die Antworten mit grep sind falsch. Sie müssen eine Option -x hinzufügen, um mit der gesamten Zeile übereinzustimmen. Andernfalls
#text to add
stimmen Zeilen wie diese immer noch überein, wenn Sie genau hinzufügen möchtentext to add
.Die richtige Lösung ist also so etwas wie:
quelle
Verwenden von sed: Wird am Ende der Zeile eingefügt. Sie können natürlich auch wie gewohnt Variablen übergeben.
Mit Oneliner sed
Die Verwendung von Echo funktioniert möglicherweise nicht unter root, funktioniert jedoch so. Sie können die Dinge jedoch nicht automatisieren, wenn Sie dies tun möchten, da möglicherweise nach einem Kennwort gefragt wird.
Ich hatte ein Problem, als ich versuchte, für einen bestimmten Benutzer vom Stamm aus zu bearbeiten. Nur das Vorherige hinzuzufügen
$username
war eine Lösung für mich.quelle
Ich musste eine Datei mit eingeschränkten Schreibberechtigungen bearbeiten
sudo
. Arbeiten mit der Antwort von ghostdog74 und Verwenden einer temporären Datei:quelle