ubuntuusers.de

Bash Script. Wort an Stelle X einfügen

Status: Gelöst | Ubuntu-Version: Ubuntu 12.04 (Precise Pangolin)
Antworten |

Dom

Anmeldungsdatum:
8. November 2004

Beiträge: 107

Hallo,

ich verzweifle gerade etwas.

Ich habe mehrere Dateien die ich auf Inhalt an einer bestimmten stelle prüfe. Ist an der Stelle kein Wort vorhanden möchte ich dort eins einfügen.

In der Datei sind die Stellen mittel | (pipe) getrennt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash

DATEI="/daten/"

VAR1=$(ls -1 $DATEI/*.txt)
for RF in $VAR1
  do
      if [ "`cut -d\| -f6 $RF | grep ""`" = "" ] ;
then

Zeichen an Stelle "cut -d\| -f6 $RF" einfügen

fi
done

Jetzt möchte ich gerne an der Stelle "cut -d\| -f6 $RF" ein Zeichen einfügen.

Ich denke es müsste mittels sed oder awk funktionieren, nur da habe ich gerade irgendwie ein Brett vorm Kopf.

Kann mir da jemand weiterhelfen?

Danke und Gruß Dominic

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Das sieht schon mal nicht gut aus:

1
DATEI="/daten/"

Datei ist ja kein String, der maskiert werden muss, sondern ein Dateipfad. Wenn da kein Blank oder ähnliches ist braucht es nicht maskiert zu werden - das ist Cargo-Cult.

Außerdem frage ich mich, ob Du ein Verzeichnis /daten auf Wurzelebene hast. Das wäre ungewöhnlich. Wenn nein, dann gehört der Slash in die Kombination von Basisverzeichnis und Unterverzeichnis, etwa

1
2
3
basis=/home/dom
subdir=daten
dir=$basis/$subdir

Wenn Du den Slash als Ende oder Anfang hier oder da zuschlägst, dann musst Du beim zusammenkleben Extracode benutzen wie ${basis}${subdir}. Außerdem musst Du immer konsistent am Ende oder am Anfang zufügen, um nicht jedesmal nachschauen zu müssen. Und eben, wenn Du vorne anfügst, dann sieht es aus wie ein absoluter Pfad.

1
2
3
VAR1=$(ls -1 $DATEI/*.txt)
for RF in $VAR1
  do

Nur Es-El loopen durch El-Es

alte, kaukasische Shellweisheit

1
2
for rf in $datei/*.txt
do 

Statt die Dateien in Strings zu wandeln, und dann fehleranfällig über solche zu iterieren solltest Du über die Dateien direkt iterieren, wann immer möglich. Das funktioniert auch problemlos mit solchen, die Leerstellen und ähnliches im Dateinamen haben.

Großbuchstaben besser dem System überlassen, und für eigene Variablen Kleinschreibung verwenden.

Jetzt würde mich interessieren wie so eine Datei üblicherweise aussieht, und wie sie nach der Behandlung aussehen soll.

Dom

(Themenstarter)

Anmeldungsdatum:
8. November 2004

Beiträge: 107

Hallo,

ok besten Dank. Werde das Script dahingehen anpassen.

Der Inhalt der Datei sieht wie folgt aus :

STR|–-|12345|ABC|DE||ABCDERFGH||123456|ABCERT|G|1.8

Ich möchte jetzt an der Stelle nach dem DE| ein Zeichen einfügen. Der Inhalt sollte danach dann so aussehen:

STR|–-|12345|ABC|DE|ZEICHEN|ABCDERFGH||123456|ABCERT|G|1.8

Gruß Dominic

Dom

(Themenstarter)

Anmeldungsdatum:
8. November 2004

Beiträge: 107

Hallo,

ich denke ich habe gerade die Lösung für mein Problem gefunden.

1
sed 's/|/ZEICHEN/5'

Damit bekomme ich dann das gesucht Zeichen in die Datei eingebaut.

Gruß Dominic

track

Avatar von track

Anmeldungsdatum:
26. Juni 2008

Beiträge: 7174

Wohnort: Wolfen (S-A)

Ja genau.

Und falls das mit dem "5. Pipe-Strich" nicht eindeutig ist, oder sich ändert, kannst Du es auch direkt mit dem "DE|" als Anker machen:

sed 's/DE|/&ZEICHEN/'

Details zu den sed- Befehlen findest Du im sed-Tutorium.

LG,

track

user_unknown

Avatar von user_unknown

Anmeldungsdatum:
10. August 2005

Beiträge: 17622

Wohnort: Berlin

Eher ist ja die Position fix, und nicht der Inhalt (DE).

Den 5. Strich würde ich mit -foo- ergänzen, indem ich alle Inhalte, die nicht | sind, gefolgt von | bis 5 zähle, und dann das so gesammelte mit & referenziere und meinen Ausdruck -foo- ergänze.

1
echo "STR|---|12345|ABC|DE||ABCDERFGH||123456|ABCERT|G|1.8"  | sed -r 's/([^|]*\|){5}/&-foo-/'
Antworten |