Discussion:
Zeilenumbruch als Feldtrenner
(zu alt für eine Antwort)
Thomas Wiedmann
2010-03-27 16:49:16 UTC
Permalink
Hallo,

wie ist die Systemvariable $IFS zu deklarieren, damit als Feldtrennzeichen
ausschließlich ein Zeilenumbruch, also auch kein Leerzeichen, interpretiert
wird?

Beispiel:

Die folgenden Zeilen
----------------
ARGS="Zwei Worte
Weitere Worte"

for ARG in $ARGS; do
echo $ARG
done
----------------
liefern:

Zwei
Worte
Weitere
Worte

Wie erreicht man, daß stattdessen

Zwei Worte
Weitere Worte

ausgegeben wird?

Thomas Wiedmann
Torsten Fleischmann
2010-03-27 17:29:27 UTC
Permalink
Post by Thomas Wiedmann
Wie erreicht man, daß stattdessen
Zwei Worte
Weitere Worte
ausgegeben wird?
Da du es doch schon auf IFS eingegrenzt hast... Warum Probierst du dann
nicht auch gleich
IFS="
"
?

,----
| ***@box ~ % IFS="
| ***@box ~ % "
| ***@box ~ % ARGS="Zwei Worte
| ***@box ~ % Weitere Worte"
| ***@box ~ %
| ***@box ~ % for ARG in $ARGS; do
| ***@box ~ % echo $ARG
| ***@box ~ % done
| Zwei Worte
| Weitere Worte
`----
--
Tschüß,
Torsten
Christian Weisgerber
2010-03-27 18:24:24 UTC
Permalink
Post by Thomas Wiedmann
wie ist die Systemvariable $IFS zu deklarieren, damit als Feldtrennzeichen
ausschließlich ein Zeilenumbruch, also auch kein Leerzeichen, interpretiert
wird?
Indem man ihr den Wert eines Zeilenendzeichens zuweist.

IFS='
'
--
Christian "naddy" Weisgerber ***@mips.inka.de
David Haller
2010-03-28 04:36:34 UTC
Permalink
Post by Thomas Wiedmann
wie ist die Systemvariable $IFS zu deklarieren,
IFS ist eine Shell-Variable. Ich tippe jetzt einfach mal auf Linux mit
GNU bash.
Post by Thomas Wiedmann
damit als Feldtrennzeichen ausschließlich ein Zeilenumbruch, also
auch kein Leerzeichen, interpretiert wird?
Setz IFS einfach.
Post by Thomas Wiedmann
Die folgenden Zeilen
ARGS="Zwei Worte
Weitere Worte"
for ARG in $ARGS; do
echo $ARG
done
oIFS="$IFS"
IFS=$'\n' ## geht selbst mit meiner uralt bash-2.03. Portabel ist
## einfach nur eine Zeilenumbruch zu verwenden: IFS='
## '. Ist halt nicht unbedingt sehr leserlich, klappt aber
## wohl überall.
for arg in $ARGS; do echo "$arg"; done
IFS="$oIFS"

In einer bash und wenn's nicht sehr portabel sein braucht ist
allerdings ein Array evtl. sinnvoller:

ARGS=( "Zwei Worte" "Weitere Worte" \
"Noch ein paar Worte, sogar
mit Umbruch" \
'und "noch" was' )
for arg in "${ARGS[@]}"; do echo "»»»$arg«««"; done

Das klappt auch mit AFAIR allen sonstigen Schweinereien.

HTH,
-dnh
--
WANTED: Schroedingers Cat, dead or alive.
Realname x
2010-03-28 08:13:06 UTC
Permalink
Post by Thomas Wiedmann
wie ist die Systemvariable $IFS zu deklarieren, damit als
Feldtrennzeichen ausschließlich ein Zeilenumbruch, also auch kein
Leerzeichen, interpretiert wird?
Die Variable IFS ändere ich persönlich ungern.

Meine Alternative sieht dann so aus:
ARGS='Zwei Worte
Weitere Worte'
echo "$ARGS"|while read ARG;do echo "$ARG";done
Helmut Waitzmann
2010-04-01 20:29:54 UTC
Permalink
Post by Realname x
Post by Thomas Wiedmann
wie ist die Systemvariable $IFS zu deklarieren, damit als
Feldtrennzeichen ausschließlich ein Zeilenumbruch, also auch kein
Leerzeichen, interpretiert wird?
Die Variable IFS ändere ich persönlich ungern.
ARGS='Zwei Worte
Weitere Worte'
echo "$ARGS"|while read ARG;do echo "$ARG";done
Die Fassung mit »read« ist aber nicht gleichbedeutend zur ursprünglichen
Fragestellung:

Interessante Effekte ergeben sich, wenn man der Variablen »ARGS« einen
Wert, der Beispielsweise am Beginn oder Ende der ersten Zeile ein
Leerzeichen hat, oder einen, der am Ende der ersten Zeile ein »\« hat,
gibt.

Die ursprüngliche Fragestellung verhält sich da anders.
--
Wenn Sie mir E-Mail schreiben, stellen | When writing me e-mail, please put my
Sie bitte meine E-Mail-Adresse mit Vor- | e-mail address together with my full
u. Nachnamen ins To- oder Cc-Feld, etwa | name into the To- or CC-header, like
To: Helmut Waitzmann <***@example.net>
Loading...