Ich habe keine Python-Lösung gesehen, daher hier:
import sys
import os
def open_and_replace(filename):
with open(filename) as read_file:
temp = open("/tmp/temp.txt","w")
for index,line in enumerate(read_file,1):
if index == 5:
temp.write("NEW STRING\n")
else:
temp.write(line.strip() + "\n")
temp.close()
os.rename("/tmp/temp.txt",filename)
for file_name in sys.argv[1:]:
open_and_replace(file_name)
Die Grundidee ist, dass für jede Datei, die in der Befehlszeile als Argument angegeben wird, eine temporäre Datei geschrieben und jede Zeile in der Originaldatei aufgelistet wird. Wenn der Index der Zeile 5 ist, schreiben wir eine andere Zeile aus. Der Rest ersetzt nur die alte Datei durch die temporäre Datei Demo:
$> ls
file1.txt file2.txt file3.txt
$> cat file1.txt
line 1
line 2
line 3
line 4
GOOD MORNING
line 6
$> python ~/replace_5th_line.py file1.txt file2.txt file3.txt
$> cat file1.txt
line 1
line 2
line 3
line 4
NEW STRING
line 6
$> cat file2.txt
line 1
line 2
line 3
line 4
NEW STRING
line 6
Dasselbe kann mit Listenverständnis erreicht werden. Unten ist ein Einzeiler des gleichen Skripts:
cat /etc/passwd | python -c 'import sys; print "\n".join(["CUSTOM" if index == 5 else line.strip() for index,line in enumerate(sys.stdin,1)])'
oder ohne cat
python -c 'import sys; print "\n".join(["CUSTOM" if index == 5 else line.strip() for index,line in enumerate(sys.stdin,1)])' < /etc/passwd
Was bleibt, ist einfach die Ausgabe von bearbeiteten Inhalten in eine andere Datei mit umzuleiten > output.txt
Sergiy Kolodyazhnyy
quelle