PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Texte in einer Datei in einer bestimmten zeile einzufügen



geist_der_foren
25.06.04, 12:51
Hi @all,

gibt es eine möglichkeit Texte in einer Datei in einer bestimmten zeile einzufügen ? Ich hab z.B. eine Datei mit folgenden layout:

#======================================
# User alias specification **ANFANG**
#======================================


# User Alias - TEST1
# ------------------
#
User_Alias TEST1 = test_user1


#======================================
# User alias specification **ENDE**
#======================================
In dieser Datei würde ich gerne noch folgendes einfügen:
# User Alias - TEST1
# ------------------
#
User_Alias TEST1 = test_user1
Am schluss soll die Datei folgender masen aussehen

#======================================
# User alias specification **ANFANG**
#======================================


# User Alias - TEST1
# ------------------
#
User_Alias TEST1 = test_user1


# User Alias - TEST2
# ------------------
#
User_Alias TEST2 = test_user2


#======================================
# User alias specification **ENDE**
#======================================
Hat jemand eine IDEE wie ich sowas für ein skript realisiren könnte ?

LKH
25.06.04, 13:44
Hi,

keine Lösung, aber ein Hinweis: wenn's um Textdateien geht ist Perl immer erste Wahl. :)

LKH

alexm
25.06.04, 13:48
Noch schöner und einfacher wäre XML, ich schwör drauf.

geist_der_foren
25.06.04, 13:53
@alexm

wie soll ich das jetzt mit XML lösen ???
Also das ist eine configurationsdatei im linux... ich möchte das schon mit shellskripting lösen, dass ich ein anders tool habe, der das ausführt.

L00NIX
25.06.04, 14:12
keine Lösung, aber ein Hinweis: wenn's um Textdateien geht ist Perl immer erste Wahl. :)


...oder (m|g)awk.

Vom Kompliziertheitsgrad in etwa vergleichbar! ;)

@OP:
Kannst du vielleicht genauer beschreiben, was du mit dieser Datei bezweckst, evtl. gibt es ja noch eine andere Möglichkeit (z.B. durch aneinanderhängen von Dateien).

geist_der_foren
25.06.04, 14:17
Das ist die /etc/sudoers und ich hab jetzt 50 Systeme auf den ich immer wieder die gleich einstellungen machen muss. Ich will ein skript schreiben der mir dies automatisch erledigt.

ich hab kein plan ... ich was mit awk hinbekommen soll :(

L00NIX
25.06.04, 14:27
Das ist die /etc/sudoers und ich hab jetzt 50 Systeme auf den ich immer wieder die gleich einstellungen machen muss. Ich will ein skript schreiben der mir dies automatisch erledigt.

ich hab kein plan ... ich was mit awk hinbekommen soll :(

Was spricht gegen eine Verteilung via SCP?

Und editieren kannst du die erste Datei mit visudo oder so...

geist_der_foren
25.06.04, 14:34
Das prob ist ... das die datei sich auf jeden System ändert !

Also ich hab es mir folgendermassen gedacht, ich such einfach nach der Folgender Zeile # User alias specification **ENDE**
und setze dann z.b. meinen eintrag 5 zeilen davor ?! Was meinst du ?

Wie kann ich eigentlich heraus finden, in welcher Zeile sich "# User alias specification **ENDE**" befindent ?

fraggo01
25.06.04, 15:46
Vielleicht hilft dir das (lösung mit sed):

http://www.odise.de/projekte/eskeidbl/html/node4.html

L00NIX
25.06.04, 15:59
Das prob ist ... das die datei sich auf jeden System ändert !

Also ich hab es mir folgendermassen gedacht, ich such einfach nach der Folgender Zeile # User alias specification **ENDE**
und setze dann z.b. meinen eintrag 5 zeilen davor ?! Was meinst du ?

Wie kann ich eigentlich heraus finden, in welcher Zeile sich "# User alias specification **ENDE**" befindent ?

Ich weiß nicht, ob es einfachere Möglichkeiten dafür gibt...



#!/bin/bash
#
# Syntax: ${ME} Datei
# Ausgabe: Neue Datei (stdout), kann dann mit > oder >> umgeleitet werden,
# oder einfach zweiten Parameter einbauen
#
FILE=$1

# Zeilennummer des Endmarkers - 2
LINE=$(( $( awk '/^# User alias specification.*ENDE/{ print NR }' sudoers ) - 2 ))

# Anzahl der Zeilen der Datei
LINE_COUNT=$( wc -l ${FILE} | awk '{ print $1 }' )

# Ausgabe des ersten Dateiteils (inkl. des letzten User_Alias)
head -n${LINE} ${FILE}

# neuen User Alias hinzufuegen
cat <<EOF
# User Alias - TEST2
# ------------------
#
User_Alias TEST2 = test_user2

EOF

# Rest der Datei anfuegen (Endmarker)
tail -n$(( ${LINE_COUNT} - ${LINE} )) ${FILE}


Das fügt nun das Hier-Dokument vor dem Endmarker ein. Vielleicht hilft dir das weiter...

geist_der_foren
28.06.04, 09:14
Also als erstes möchte ich mir bei allen bedanken für die Hilfe, vorallem bei L00NIX für den CODE.

@L00NIX
Das ist eine Super Idee gewesen, gibt es nicht die möglichkeit mit sed den Text ab Zeile 11 z.B. einfach ranzuhängen, so dass ich möglichst keine neue Datei erzeugen muss ? Ich hab es schon ein weilchen mit SED versucht, aber leider nicht hinbekommen. :confused:

Der Gestreifte
28.06.04, 11:03
Das ist eine Super Idee gewesen, gibt es nicht die möglichkeit mit sed den Text ab Zeile 11 z.B. einfach ranzuhängen, so dass ich möglichst keine neue Datei erzeugen muss ? Es soll seds geben, die die Option "-i" kennen und so direkt in die originale Datei schreiben, ansonsten nimm halt "cp -b" (Backup der originalen Datei ist selten ein Fehler).
Mit einer Datei "mach_neue_zeile.sed":
11a\
Text der nach der elften Zeile Eingefügt werden sollund der Kommandozeile:
sed -f mach_neue_Zeile.sed originale_datei wird dann nach der elften Zeile der Datei "originale_datei" derText eingefügt.

geist_der_foren
28.06.04, 15:05
@Der Gestreifte

Das mit der Option -i, was ein super tip, danke ... ich hab es nun folgender maßen geregelt:
# VARIABLEN
# ---------
#
FILE=test_sudo2
TEXT_NR=$(( $( awk '/^# User alias specification.*ENDE/{ print NR }' $FILE ) - 2 ))

# PROGRAMM
# --------
#
while read TEXT
do
sed -i "$TEXT_NR a\ $TEXT" $FILE
TEXT_NR=$((TEXT_NR+1))
done < a


Somit schreibt er mir das gleich in die Datei rein...
Aber die Ausgabe sieht dann folgendermasen aus:
#======================================
# User alias specification **ANFANG**
#======================================


# User Alias - TEST1
# ------------------
#
User_Alias TEST1 = test_user1

# User Alias - TEST2
# ------------------
#
User_Alias TEST2 = test_user2
#======================================
# User alias specification **ENDE**
#======================================


Er macht blöder weiße mir einen Leerzeichen rein, da ich in meinen code folgendes drinstehen hab
sed -i "$TEXT_NR a\ $TEXT" $FILE Das leerzeichen nach \a $TEXT wird auch eingefügt :( Wie kann ich da unterbinden ? Ich hab schon folgendes Probiert
sed -i "$TEXT_NR a\ {$TEXT}" $FILE Hat aber nicht gefunkt, weil er mir das auch mit reingebracht hat und er mir dann folgendes aus gegeben hat:
#======================================
# User alias specification **ANFANG**
#======================================


# User Alias - TEST1
# ------------------
#
User_Alias TEST1 = test_user1

{# User Alias - TEST2}
{# ------------------}
{#}
{User_Alias TEST2 = test_user2}
#======================================
# User alias specification **ENDE**
#======================================

psycho0815
28.06.04, 16:28
vielleicht so?
sed -i "$TEXT_NR a\ ${TEXT}" $FILE

gruß -psycho-

geist_der_foren
28.06.04, 16:33
danke für den Tip ... aber das funkte auch nicht ... :(

EDIT:

Lange habe ich probiert, dass ich nicht gleich drauf gekommen bin !
Also so funktioniert das:
sed -i "$TEXT_NR a\\$TEXT" $FILE
Ich hab den entgültingen code noch nicht fertig, ich werde wenn ihr möchtet mein skript dann posten ...
Das skript soll am schluss folgendes können, es werden 3 Datein erstellt, in dem die Definitionen für die Sudoers stehen, wenn man das Skript ausführt, werden diese Definitionen über das skript automatisch in die Sudo eingetragen... Das wird dann über scp an alle server Copiert und dann ausgeführt. Das erleichert einem wirklich viel arbeit...

Ich möchte mich bei allen bedanken, die mir hier geholfen haben . DANKE !

gruß

geist_Der_foren