Ich habe eine Datei mit Kommentaren:
foo
bar
stuff
#Do not show this...
morestuff
evenmorestuff#Or this
Ich möchte nur den gesamten unkommentierten Code ausdrucken:
foo
bar
stuff
morestuff
evenmorestuff
Es ist so wichtig, dass Kommentare aus einer Datei entfernt werden können ... Was ist ein guter Weg, dies zu tun?
shell-script
text-processing
awk
sed
grep
Fragezeichen
quelle
quelle
awk -F\# '$1!="" { print $1 ;} '
.echo '#' # output a #
behandelt werden?Antworten:
Eine Möglichkeit , alle Kommentare zu entfernen , ist die Verwendung
grep
mit-o
Option:woher
-o
: druckt nur einen übereinstimmenden Teil der Zeile^
: Beginn der Zeile[^#]*
: beliebiges Zeichen außer#
null oder mehrmals wiederholtBeachten Sie, dass auch leere Zeilen entfernt werden, aber Zeilen mit nur Leerzeichen bleiben.
quelle
grep -v '^#' file > newfilewithoutcomments
somvar='I am a long complicated string ## with special characters' # and I am a comment
nicht korrekt behandelt wird.grep -o '^[^#].*' file
sed
Lösung hat nur eine leere Zeile, scheint ein solides Argument zu sein, um eine andere Antwort zu verwenden, es sei denn, ich vermisse etwas?grep
vielleicht definiert? Versuchen Sie ,grep
zucommand grep
, wenn man noch Räume , die Abtastwerteingang posten.Ich glaube, das
sed
kann man viel besser alsgrep
. Etwas wie das:Erläuterung
sed
In der Standardeinstellung wird Ihre Datei zeilenweise überprüft und jede Zeile gedruckt, nachdem möglicherweise die Transformationen in den Anführungszeichen angewendet wurden. (sed '' your_file
druckt nur alle Zeilen unverändert aus).sed
zwei Befehle für jede Zeile ein (sie sind durch ein Semikolon getrennt)./^[[:blank:]]*#/d
. Auf Englisch bedeutet dies, dass, wenn die Zeile am Anfang mit einem Hash übereinstimmt (mit vorangestellter Anzahl von Leerzeichen), diese Zeile gelöscht wird (sie wird nicht gedruckt).s/#.*//
. Ersetzen Sie im Englischen also eine Raute gefolgt von so vielen Dingen wie möglich (bis zum Ende der Zeile) durch nichts (nichts ist der leere Raum zwischen den letzten beiden//
).quelle
mystring="Hello I am a #hash"
wirdmystring="Hello I am a"
crontab
erlauben viele Konfigurationsdateien, wie zum Beispiel, nur vollständige Kommentare mit oder ohne vorangestelltem Leerzeichen, aber keine nachgestellten Kommentare in einer Zeile. Die Logik ist VIEL einfacher. Verwenden Sie in dieser Antwort nur die erste der beiden Sed-Anweisungen für eine Crontab Kommentar Stripper.)#
(in Spalte 1) beginnen, Gibt es irgendeinen Vorteil fürsed
overgrep -v "^#"
?Sie können die gewünschte Ausgabe mit dem Befehl sed erzielen. Der folgende Befehl hatte den Trick für mich getan.
Woher
#.*$
- Regexp filtert alle Zeichenfolgen, die#
bis zum Ende der Zeile beginnenHier müssen wir diese Zeilen entfernen, also ersetzen wir sie durch ein leeres, also überspringendes Ersatzteil.
g
- Erwähnung der wiederholten Suche im Muster bis zum Ende der Datei.Allgemeine Syntax von sed:
s/regexp/replacement/flags FileName
quelle
sed
Befehl enthält ...print "#tag" # Print a hashtag.
Wie bereits erwähnt, funktionieren sed und andere textbasierte Tools nicht gut, wenn Teile eines Skripts wie Kommentare aussehen, dies jedoch nicht der Fall ist. Zum Beispiel könnten Sie ein # in einer Zeichenkette finden, oder das eher gebräuchliche
$#
und${#param}
.Ich habe einen Shell-Formatierer namens shfmt geschrieben , der eine Funktion zum Minimieren von Code enthält. Dazu gehört unter anderem das Entfernen von Kommentaren:
Der Parser und der Drucker sind Go-Pakete. Wenn Sie also eine benutzerdefinierte Lösung wünschen, sollte es ziemlich einfach sein, ein 20-zeiliges Go-Programm zu schreiben, um Kommentare genau so zu entfernen, wie Sie es möchten.
quelle
Sie können invert match wie folgt verwenden:
-v, --invert-match Invertiert den Übereinstimmungssinn, um nicht übereinstimmende Linien auszuwählen. (-v wird von POSIX angegeben.)
quelle
evenmorestuff
im Beispiel des OP vollständig entfernt .grep -o '^[^#]*' file
wäre die beste Lösung. das erklärt schon jimmij. Vielen Dank für Ihre Bewertungprint "#tag" # Print a hashtag.
Ich mag Josephs Antwort, brauchte sie aber, um // Kommentare zu entfernen, also habe ich sie leicht modifiziert und auf redhat getestet
Ich wette, es gibt eine bessere Möglichkeit, Leerzeilen zu entfernen, als Zeichenfolgen zu verwenden, aber es war die schnelle und schmutzige Lösung, die ich verwendet habe.
-Prost
quelle
print "#tag" # Print a hashtag.
Das hat bei mir funktioniert
quelle
print "#tag" # Print a hashtag.
Es wird
#
als Spaltentrennzeichen verwendet und behält nur die erste Spalte (das ist alles vorher#
).quelle
YOUR_FILE
es sich um ein Skript handelt, das diese Befehle enthält, verbleibt das Skriptcat YOUR_FILE | cut -'
in der Datei in dieser Zeile.Verwenden Sie Ausdruck wie
: -v: invertiert die Übereinstimmung
: #: stimmt mit allen Zeilen überein, die mit # beginnen
: $ ^: stimmt mit allen Leerzeilen überein
quelle
#
stimmt überall auf der Leitung überein und entfernt die gesamte Leitung.Die beste Lösung wäre, den Befehl zu verwenden:
sed -i.$(date +%F) '/^#/d;/^$/d' ntp.conf
Das -i ist die direkte Bearbeitung, aber das direkt folgende Präfix weist sed an, ein Backup zu erstellen. In diesem Fall mit einer Datumserweiterung (ntp.conf.date) führen wir zwei Befehle mit jeweils einem Adressraum aus. Der erste löscht die kommentierten Zeilen und der zweite, der durch ein Semikolon vom ersten getrennt ist, löscht die leeren Zeilen.
Ich habe diese Lösung auf theurbanpenguin.com gefunden
quelle
Keine der anderen Antworten scheint dies zu rechtfertigen. Entweder stehen sie in leeren Zeilen oder in Zeilen, in denen sich der Kommentar nicht im ersten Zeichen befindet. Am Ende habe ich Folgendes verwendet:
Dadurch wird ein Alias erstellt, sodass Sie sich diesen nicht merken müssen (was zunächst unmöglich ist). Öffnen Sie eine neue Sitzung und Sie erhalten den neuen
nocom
Befehl. Dann kannst du einfachProst.
quelle
.*$
in der ersten Regex eine Übereinstimmung zu finden - der Anker ist nicht nützlich und Sie erfassen nicht den übereinstimmenden Text, der in einem Ersatz verwendet werden soll. benutze einfach^\s*
print "#tag" # Print a hashtag.
Nach der zweiten Antwort von Joseph R.
/^$/d
entferne ich eine Leerzeile.quelle
Ich poste, was für mich funktioniert und am sinnvollsten erscheint, nachdem ich die anderen mit Erklärungen durchgelesen habe. Ein paar Beiträge kamen nahe, aber ich konnte noch keinen Kommentar abgeben (weil ich ein Neuling bin):
-E
= interpretiere das folgende Muster als regulären Ausdruck, ähnlich wie egrep-v
= Invertierung des Musters drucken (Zeilen, die nicht zum Ausdruck passen, werden gedruckt)"(^#.*|^$)"
= dies hat eine Pipe, die eine OR-Anweisung bezeichnet. Dieser Ausdruck sagt, dass jede Zeile, die mit einem#
(und irgendetwas anderem danach) beginnt, ODER jede Zeile mit null Zeichen zwischen dem Anfang und dem Ende der Zeile gedruckt werden soll .Das
-v
wird auf dem Bildschirm die Umkehrung von dem ausgeben, die jede Zeile mit Zeichen sein wird, die nicht mit einem beginnt#
.quelle
print "#tag" # Print a hashtag.