Wie kann ich den Rest der Datei für alle Dateien aus der Zeichenfolge entfernen?


9

Wie kann ich den Rest der Datei für alle Dateien aus der Zeichenfolge entfernen?

Beispielsweise sind Eingabedateien 1und 2Zeichenfolge ddd.

Eingabedatei 1.

aaa
bbb
ccc
ddfbbd dddaaa
eee

Ausgabedatei 1.

aaa
bbb
ccc
ddfbbd 

Eingabedatei 2.

ccc
aergddd
dasdvsdb

Ausgabedatei 2.

ccc
aerg

Antworten:


11

Mit GNU sed:

str="ddd"
for file in 1 2; do
    sed -i "/$str/ {s/$str.*//; q}" "$file"
done

Dies muss sich in einer Schleife befinden. Andernfalls würde der qBefehl den gesamten Prozess abbrechen, nachdem nur die erste Datei verarbeitet wurde.


1
Fand es interessant, dass Sie vor 8 Jahren eine ähnliche Frage in Unix & LInux beantwortet haben: unix.stackexchange.com/a/11323/200094
WinEunuuchs2Unix

Ich frage mich, ob Sie nur danstelle vonq
D. Ben Knoble

Sie können es gerne versuchen. sed ist für mich kein Werkzeug, wenn die Dinge komplizierter werden als das, was ich getan habe.
Glenn Jackman

7

Mit Perl:

perl -i -0777 -pe 's/ddd[\s\S]*//' file

oder

perl -i -0777 -pe 's/ddd.*//s' file
  • -i: Ändern Sie die Datei an Ort und Stelle.

  • -0777: Perl zwingen, die Datei als Ganzes zu schlürfen, nicht Zeile für Zeile.

  • -pe::

    • -p: Perl-Code schleifen.
    • -e: Perl-Code ausführen.
  • 's/ddd[\s\S]*//': Ersetzen Sie alles (jedes Leerzeichen ( \s) und jedes Nicht-Leerzeichen ( \S)) nach ddd(einschließlich) durch eine leere Zeichenfolge.

  • 's/ddd.*//s': Ersetzen Sie alles ( .*) nach ddd(einschließlich) durch eine leere Zeichenfolge. Die sFlagge am Ende .*passt auch zu den Zeilenumbrüchen (danke @glennjackman).

Mehr über Perl-Flags finden Sie hier .


Warum nicht einfach s/ddd.*//?
Dessert

@dessert .*hört bei newline auf zu passen.
user3140225

Sie können verwenden. .*Wenn Sie dem Befehl das Flag moder hinzufügen (ich vergesse welches)ss///
Glenn Jackman

@glennjackman Es ist die sFlagge. Vielen Dank!
user3140225

4

Mit GNU awkkönnen wir Folgendes tun:

awk 'function output(){ print >>FILENAME".out" }
     /ddd/{ sub(/ddd.*/,""); output(); nextfile }
          { output() }' file[12]

an Ort und Stelle zu ändern, was den Befehl noch einfacher macht:

gawk -i inplace '/ddd/{ sub(/ddd.*/,""); print ; nextfile }1' file[12]
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.