Solaris/Unix Lösung Bearbeitung von Textdatei mit sed/perl

MrDeluxe

Enthusiast
Thread Starter
Mitglied seit
01.04.2006
Beiträge
1.443
Hallo,

ich schreibe gerade ein kleines Skript, was automatisiert eine Datei bearbeiten soll unter Solaris.

Dateiaufbau:
10.A.B.XXX LOSASWZB0018_5708YY V570850 LOSASWZB5518 #INV@NDB
10.C.D.E _5708YY 10.A.B.XXX LSL-_ #INV_KS


Ich möchte per Skript in der 1. Zeile am Dateianfang eine Raute (#) hinuzfügen.
Problem an der Sache ist, "sed -i" gibt es hier leider nicht damit würde es gehen :(


Teillösung:
perl -pi -e ’s/10.20.81.XXX /#10.20.81.XXX /g’ /tmp/afile

Ergebnis: in der 2. Zeile wird ebenfalls eine Raute hinzugefügt und das ist unerwünscht.

Habt ihr einen Tipp für mich?
 
Zuletzt bearbeitet:
Wenn Du diese Anzeige nicht sehen willst, registriere Dich und/oder logge Dich ein.
Dann lass doch das einfach das 'g' hinten am Befehl weg, das ist die "global" flag. Ohne diese sollte er nur das erste Vorkommen des Such-Strings bearbeiten ;)
 
Nein auch ohne dem 'g' sind alle mit 10.20.81.XXX --> #10.20.81.XXX auskommentiert wurden.
 
Evtl hilft Dir das weiter. Eigentlich sollte ohne das "/g" nur eine Zeile abgeändert werden.

# Ersetze (Suchen und Ersetzen) "foo" mit "bar" in jeder Zeile

sed 's/foo/bar/' # Ersetzt nur das 1. Vorkommen pro Zeile
sed 's/foo/bar/4' # Ersetzt nur das 4. Vorkommen pro Zeile
sed 's/foo/bar/g' # Ersetzt ALLE Vorkommen von "foo" mit "bar"
sed 's/\(.*\)foo\(.*foo\)/\1bar\2/' # Ersetzt nur das vorletzte Vorkommen pro Zeile
sed 's/\(.*\)foo/\1bar/' # Ersetzt nur das letzte Vorkommen pro Zeile


# Ersetze "foo" mit "bar" NUR in Zeilen die "baz" enthalten
sed '/baz/s/foo/bar/g'

# Ersetze "foo" mit "bar" AUSSER in Zeilen die "baz" enthalten
sed '/baz/!s/foo/bar/g'


aus: Nützliche, einzeilige Scripts für SED (Unix Stream Editor)
 
sed macht aber nichts außer den Text in der Datei zu manipulieren, er wird aber nicht verändert, das geht eben NUR mit sed -i
 
Wie wäre es dann die jeweilige, von sed veränderte Ausgabe, irgendwo nach /tmp/ zu pipen und dann die originaldatei mit dieser temporären ersetzen? So könnte man auch das original zunächst als .old o.ä. abspeichern, damit man ein Backup hat ;)
 
bei mir unter linux
sed 'bearbeitet' alle zeilen, /g gilt für eine zeile
Code:
[mac@alpha tmp]$ echo -e "zeile 1\nzeile 2" | sed 's/^/#/'
#zeile 1
#zeile 2
[mac@alpha tmp]$ echo -e "zeile 1\nzeile 2" | sed 's/e/#/'
z#ile 1
z#ile 2
[mac@alpha tmp]$ echo -e "zeile 1\nzeile 2" | sed 's/e/#/g'
z#il# 1
z#il# 2
[mac@alpha tmp]$ echo -e "zeile 1\nzeile 2" | sed '1s/^/#/'
#zeile 1
zeile 2

also, bei dir so etwas, das 1s ist eine Eins
Code:
sed '1s/^/#/' meinedatei > meinetemporäredatei && mv meinetemporäredatei meinedatei
 
Hardwareluxx setzt keine externen Werbe- und Tracking-Cookies ein. Auf unserer Webseite finden Sie nur noch Cookies nach berechtigtem Interesse (Art. 6 Abs. 1 Satz 1 lit. f DSGVO) oder eigene funktionelle Cookies. Durch die Nutzung unserer Webseite erklären Sie sich damit einverstanden, dass wir diese Cookies setzen. Mehr Informationen und Möglichkeiten zur Einstellung unserer Cookies finden Sie in unserer Datenschutzerklärung.


Zurück
Oben Unten refresh