In der folgenden Datei:
Lorem ipsum dolor sitzt amet, consectetuer adipiscing elit. Ut eu metus id lectus vestibulum ultrices. Maecenas Rhoncus.
Ich möchte alles vorher consectetuer
und alles nachher löschen elit
.
Meine gewünschte Ausgabe:
consectetuer adipiscing elit.
Wie kann ich das machen?
shell-script
text-processing
manuel
quelle
quelle
sed
. Es kann auchperl
oder sogar reine Bash sein.Antworten:
Ich würde sed benutzen
Dekodiert die sed s / find / replace / Syntax:
s/^.*
- Ersetze beginnend am Anfang der Zeile (^
) gefolgt von irgendetwas (.*
) bis ...\(
- einen benannten Block startenconsectetuer.*elit\.
- Ordnen Sie das erste Wort zu, alles (.*
) bis zum letzten Wort (in diesem Fall einschließlich des abschließenden Punkts), mit dem Sie übereinstimmen möchten\)
- Beenden Sie den genannten Block.*
) auf das Ende der Zeile ($
)/
- Beenden Sie die Ersatzsuche\1
- ersetzen mit dem Namen Block zwischen dem\(
und dem\)
oben/
- Ersetzen beendenquelle
^
oder nicht,$
da sed versucht, die längste Übereinstimmung zu finden. Außerdem haben Sie möglicherweise den Punkt danach verpasstelit
, den Sie\.
bei Bedarf einfügen können.^
und$
nicht notwendig sind - ich habe sie dort gelassen, weil der Fragesteller (ursprünglich) bemerkt hat, dass er ein bisschen ein Anfänger war und dies in anderen Zusammenhängen hilfreich sein kann.Wenn jede Zeile sowohl Start- als auch Endmuster enthält, ist dies am einfachsten mit möglich
grep
. Anstatt den Anfang und das Ende jeder Zeile zu löschen , können Sie einfach den Inhalt zwischen beiden Mustern ausgeben. Die-o
Option in GNUgrep
gibt nur die Übereinstimmungen aus:Hinweis: Wie bereits erwähnt, funktioniert dies nur, wenn jede Zeile in der Datei auf diese Weise analysiert werden kann. Andererseits sind das 80% aller typischen Anwendungsfälle.
quelle
Zwei für Schleifen in AWK:
AWK's gsub:
quelle
Ein Perl Weg. Dies entspricht im Wesentlichen der Antwort von MikeV
sed
:Das
-p
bedeutet "drucke jede Zeile nach dem Anwenden des mit-e
". Ders/foo/bar/
ist der Substitutionsoperator; es wird ersetztfoo
durchbar
. Die Klammern erfassen ein Muster und lassen uns es als Ersatz verwenden. Das erste erfasste Muster ist$1
das zweite$2
und so weiter.Der Befehl vergleicht also alles bis
consectetuer
(.*consectetuer
), dann alles biselit
(.*elit
) und dann alles andere bis zum Ende der Zeile (.*
) und ersetzt dies durch das erfasste Muster.quelle
Ich bin nicht sicher, warum dieser Fragentitel " von Datei " zu " von einer Zeile " bearbeitet wurde, während das OP die Möglichkeit über mehrere Zeilen nicht ausschließt, obwohl das Beispiel nur eine Zeile zu sein scheint. Wie auch immer, es könnte hilfreich sein, hier eine Lösung mit mehreren Leitungen bereitzustellen.
Dies funktioniert für gekreuzte Linien:
Beispiele:
Referenz: Shell-Parametererweiterung
quelle