Shell eine Zeile löschen?
Hallo Liebe Community ich suche ein shell Script das aus Einer Datei drin steht eine zahl löscht die angegeben wir aber nur 1 mal und nicht öfter hier ein bsp:
Datei mit Zahlen:
12
13
14
13
12
Und Jetzt soll das Script nicht einfach die erste zeile löschen sonder wenn $Zahl ist z.b 12 soll nur die erste 12 gelöscht werden und nicht die 2 auch noch also zu
13
14
13
12
Ich weürde mich über eine Rückmeldung Freunden
MFG: Schulschluss
3 Antworten
Vom Beitragsersteller als hilfreich ausgezeichnet
Das geht in einer Zeile mit der Shell (aber nur, wenn $zahl wirklich mindestens einmal in $file enthalten ist):
sed -i -e `grep -n "^$zahl *" $file | cut -d: -f1 | head -1`d $file
Von gutefrage auf Grund seines Wissens auf einem Fachgebiet ausgezeichneter Nutzer
Computer, Linux
Hier ein Script in der Sprache tcl
Tcl installieren die Zeilen in eine Datei kopieren, die Datei ausführbar machen ( chmod 755 <datei-Name> ) und starten / ./datei-Name <Datei mit den Zahlen> <die Zahl>
#!/bin/bash
# \exec tclsh "$0" "$@"
puts "### Benutzung: $argv0 <Datei-Name> <Zahl> "
puts "### aus <Datei> wird die angegeben Zahl entfernt, wenn sie mehrfach vorhanden ist\n"
if { ![file exist [lindex $argv 0 ] ] } { puts "Datei [lindex $argv 0 ]nicht vorhanden" ; exit }
if { [lindex $argv 1] == "" || ![string is integer [lindex $argv 1 ]] } { puts " der 2. Paramemeter ist keine Zahl" ; exit }
set fpi [open [lindex $argv 0 ] r ]
set fpo [open .#[lindex $argv 0 ] w ]
set flag 0
while { ![eof $fpi ] } { set line [ gets $fpi ]
if { $line != [lindex $argv 1 ] } { puts $fpo $line ; continue }
if { $flag == "0" } { puts $fpo $line }
incr flag
}
close $fpo
close $fpi
file rename -force .#[lindex $argv 0 ] [lindex $argv 0 ]
puts " $flag mal wurde die Zahl \"[lindex $argv 1 ]\" gefunden "
Woher ich das weiß:Berufserfahrung – openSuSE seit 1995
Ich denke, dass das hier ganz nützlich sein könnte.
Alternativ mit Python:
with open('data.txt', 'r') as file:
lines = [line.rstrip() for line in file.readlines()]
filter_for = '12'
lines.remove(filter_for)
print('\n'.join(lines))