ForumTabstops in Sktipten verarbeiten?
Marcus Fischer – Donnerstag, 13. Oktober 2005 22:52 Uhr

Hallo zusammen,

ich sitze zur Zeit vor einem kleinen Skript, welches mir einen eingelesenen String auswertet und abhängig von diesem Ergebnis eine Textdatei schreibt. Konkret geht es darum, die Datei captions.txt zu erzeugen, die vom Perl-Skript album (siehe [1]) wiederum verarbeitet wird.

Mein Skript kann unter [2] runter geladen werden, ich packe hier nur den interessanten Abschnitt mit der Funktion “captions()” rein:
# captions() will ask for image descriptions
# and append them to an captions.txt file within the
# PWD directory.
# An leading “#” character in a lign will tell album
# to exclude this image to the album generation.

captions()
{
IMAGE=$1
if [ -f captions.txt ];
then
echo “file exists” > /dev/null
else
touch captions.txt
fi
# if-then-else checks, if captions.txt
# is already available
# If not, then create captions.txt file!

echo -en “\n\nInsert your comment to the image here: “
read comment
COMMENT=${comment}
# IMAGE_DATE= Read from EXIF info pool
# COMMENT=$IMAGE_DATE” – “$COMMENT

TEST01=`echo $COMMENT | awk ‘{print $1}’`
# awk expects the “#” character on first position,
# followed by an blank.
if [ $TEST01 = “#” ]; then
echo “Image will be hidden in album”
else
TEST01=””
fi

COMMENT=$TEST01$IMAGE” “$COMMENT
echo $COMMENT >> captions.txt
}

Wie man sieht, ist schon ein wenig gefummelt worden zum testen ($TEST01 etc.)

Ich möchte einen Kommentar einlesen und prüfen, ob das erste Zeichen ein #-Zeichen ist! – Wenn ja, handelt es sich laut der Convention der Datei captions.txt um ein Bild, was später beim Erzeugen des Albums ausgelassen wird!

Die Zeile, die in die Datei captions.txt geschrieben werden soll, ist folgend aufgebaut (siehe Abschnitt 2 unter [1]):
Dateiname.jpg [Tab] Kommentar oder
#Dateiname.jpg [Tab] Kommentar Nun brauch ich aber kein Leerzeichen in dem String, sondern möchte eben diesen Tabstop schreiben! – Wie geht dies?

Vielen Dank vorweg,
Marcus Fischer

[1] http://marginalhackers.com/Hacks/album/Docs/Section_2.html
[2] http://marcusfischer.com/Ablage/image_orientation.sh

1 Antwort
man-draker – Freitag, 14. Oktober 2005 09:22 Uhr

Ich würde es mit “\t” versuchen (vergleiche den Abschnitt Quoting in man bash).

Eine Unstimmigkeit ist mir in deinem Posting aufgefallen:

In deinem Script kommentierst du:
# awk expects the “#” character on first position,
# followed by an blank.

In deinem posting schreibst du:
Dateiname.jpg [Tab] Kommentar oder
#Dateiname.jpg [Tab] Kommentar

Nur eins von beiden kann stimmen.
(Aber das nur so am Rande.)

Marcus Fischer – Freitag, 14. Oktober 2005 10:09 Uhr

Hallo man-draker, danke für den Tipp!

Die Unstimmigkeit ist schon richtig, ich hole mir mittels awk an der Stelle $1 das erste “Word” raus. Und daher brauche ich ein einzelnes #-Zeichen um zu erkennen, ob die Zeile auskommentiert wird oder nicht.
Der Dateiname wird auch nicht von mir eingegeben sondern später davor bzw. dazwischen gesetzt, aber dann halt mit einem Tabstop nach dem Dateinamen! So, ich habe nun in die Bash-Manpage geschaut und komme leider nicht weiter, es funktioniert nicht wie gewünscht. Ich hatte auch hier im Forum einen ähnlichen Fall gefunden und bereits ausprobiert:

Weder COMMENT=$TEST01$IMAGE$’\t’$COMMENT noch
COMMENT=$TEST01$IMAGE”$’\t’”$COMMENT

brachten mich richtig weiter. Und Ebenfalls \x09 nicht, der Hexcode für ASCII laut einem RegExpr-Manual was vor mir liegt.

Wie muss die Zeile lauten, damit das Charakter geschrieben wird?
echo “A”$’\t’”BB”$’\t’”CCC” jedenfalls funktioniert. Das ist aber die gleiche Syntax wie meine obere Zeile :-?

Gruß,
Marcus

Marcus Fischer – Freitag, 14. Oktober 2005 10:27 Uhr

Ok, habe noch einen Test gemacht. Es scheint nicht zu funktionieren mit Variablen, die ich setzen möchte! [marcus@mfclient ~]$ TEST01=AA$’\t’BB
[marcus@mfclient ~]$ echo $TEST01
AA BB
[marcus@mfclient ~]$ echo AA$’\t’BB
AA [tab] BB

Merkwürdig, oder? — Ist die Bash an dieser Stelle ggf. eingeschränkt?

Ulrich Koschella – Freitag, 14. Oktober 2005 12:57 Uhr

probiers mal mit:

[marcus@mfclient ~]$ TEST01=AA$’\t’BB
[marcus@mfclient ~]$ echo “$TEST01”

Die Variable wurde richtig gesetzt, Dein Problem ist die Eigenschaft von echo, das jedes Argument Space-separiert ausgibt.

Gruss, Uli

Marcus Fischer – Dienstag, 18. Oktober 2005 12:33 Uhr

Ulrich, dein Tipp war Gold wert! Vielen Dank!!!
Jetzt läuft es wie gewünscht!

Gruß,
Marcus