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
genderbee
quelle

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.

Glenn Jackman
quelle
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 .

user3140225
quelle
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]
αғsнιη
quelle