Ist es überhaupt möglich, Sonderzeichen wie \ aus einer Datei zu löschen, während man mit sed und einer Kommentarzeile, die aus „Word“ besteht, die Datei liest und darin sucht. Anschließend wird gespeichert, aber \ bleibt an der Stelle?
Ich meine, ich habe eine Datei mit Firmennamen (2 Wörter) und dazwischen können einige Zeichen sein und in der Originaldatei wurde für diese Symbole Zeichen-Escapezeichen (reguläre Ausdrücke) verwendet. Zum Beispiel
lunar_static KKK_ITALY_NUM "/^08.00.Delta\\_M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\.M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
Ich ersetze \ durch nichts und kommentiere, aber ich möchte auch mit \ speichern, wie es vorher war. Die Ausgabe, die ich gerne hätte:
lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
Mein Skript ist:
sed -E -e 's/\\//g' -i -e '/ITALY.*Delta M/s/^/#/' file.txt
Aber es wird ohne \ gespeichert. Ja, ich weiß, ich kann nicht löschen und nur nach Red\\\\ Park suchen. Wenn ich jedoch 20 Namen habe, möchte ich nicht für jeden Firmennamen, der aus 2-3 Wörtern besteht, \\\\ eingeben:) Oder haben Sie vielleicht eine andere Vorstellung, wie man es mit einem anderen Befehl macht, nicht mit sed? Ich bin für jeden Rat und jede Hilfe offen. Ist es möglich, das zu bekommen, was ich will? Vielen Dank!
Antwort1
Wenn ich Sie richtig verstehe, schauen wir mal, ob das bei Ihnen funktioniert:
sed -E -e 's/^(.*\w+)\\\\ /#\1\\\\ /' -e 's/\\\\.([^ ]*)$/\\\\ \1/ file
Ausgabe:
lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
#lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
Antwort2
Man sagt, Beharrlichkeit sei eine Tugend …
Ich gehe davon aus, dass alle beiden Firmennamen durch \\
ein weiteres Zeichen getrennt sind und dass Länder immer groß geschrieben werden und alle Firmen mindestens einen Kleinbuchstaben enthalten, d. h. eine Firma kann keine Teilzeichenfolge eines Landes sein.
Eine awk
Lösung, wenn Ihre diese -i inplace
Option unterstützt; ich glaube, die meisten tun das
awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\\' 'BEGIN{
OFS="\\"}
$1~country && NR>1?$(NR-2)$NR:$1~company{
printf "#"}
NF>1{$NF=" "substr($NF,2)
};1' file1
Output
#lunar_static KKK_ITALY_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ROMANIA_NUM "/^08.00.Delta\\ M$/"
lunar_static KKK_ITALY_NUM "/^08.00.Red\\ Park$/"
lunar_static KKK_FRANCE_NUM "/^08.00.Green\\ Banana$/"
Lösungsweg
Sagen Sie awk
, dass Sie die Änderungen vornehmen -i inplace
und Ihr Land und Ihr Unternehmen als Variablen übergeben sollen . Da Sie in Ihrer Datei -v
ein unbekanntes Trennzeichen haben, verwenden Sie es zwischen den beiden Teilen des Firmennamens\\
.
awk -i inplace -v country="ITALY" -v company="Red.Park" -F'\' 'BEGIN{
Setzen Sie den Feldtrenner auf „break on“, \
wodurch Sie 3 Felder erhalten, in denen \\
auftritt, und setzen Sie dann
OFS="\\"}
um sie beim Drucken wieder einzufügen, wenn es eine Unterbrechung gab.
Wenn dies das erste Feld $1==country
ist, handelt es sich um den ersten Teil der Übereinstimmung.
Überprüfen Sie für das Unternehmen, ob Sie die Felder aufgeteilt haben \
und am Ende mehrere Felder übrig geblieben sind, NR>1
und testen Sie sie dann je nach Bedarf entweder anhand der letzten beiden Felder oder des nicht aufgeteilten Felds.
Wenn wir eine Übereinstimmung haben, dann printf #
(das ist Drucken ohne Zeilenumbruch)
$1~country && NR>1?$(NR-2)$NR:$1~company{
printf "#"}
Wenn Sie mehr als ein Feld haben, NF>1
teilen Sie es \\?
zwischen Firmennamen auf und möchten sicherstellen, dass ?
beim Drucken Leerzeichen vorhanden sind. Entfernen Sie daher das erste Zeichen des letzten Felds und ersetzen Sie es durch ein Leerzeichen.
NF>1{$NF=" "substr($NF,2)
Und drucken
;1' file1