Discussion:
gleiche zeichen zählen
(zu alt für eine Antwort)
karl teuschler
2004-11-04 18:18:37 UTC
Permalink
hallo,

ich habe einen String der zB. so aussieht.

string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?

Danke im Voraus

Karl
Andreas Kretschmer
2004-11-04 18:38:14 UTC
Permalink
Post by karl teuschler
hallo,
ich habe einen String der zB. so aussieht.
string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?
Du solltest Dir eine Schriftart mit gleicher Zeichenbreite für alle
Zeichen installieren. Ich befüchte, daß ich was anderes auf dem Monitor
sehe als Du.


end
Andreas
--
Diese Message wurde erstellt mit freundlicher Unterstützung eines freilau-
fenden Pinguins aus artgerechter Freilandhaltung. Er ist garantiert frei
von Micro$oft'schen Viren. (#97922 http://counter.li.org) GPG 7F4584DA
Was, Sie wissen nicht, wo Kaufbach ist? Hier: N 51.05082°, E 13.56889° ;-)
karl teuschler
2004-11-05 06:33:28 UTC
Permalink
Post by Andreas Kretschmer
Du solltest Dir eine Schriftart mit gleicher Zeichenbreite für alle
Zeichen installieren. Ich befüchte, daß ich was anderes auf dem Monitor
sehe als Du.
Ich hab's mit dem Browser verfasst, über Google gepostet.

Sollte das in dem Fall auch einen Sinn haben, eine andere Schriftart
zu installieren?

mfG
Karl
Juergen P. Meier
2004-11-05 07:03:22 UTC
Permalink
Post by karl teuschler
Post by Andreas Kretschmer
Du solltest Dir eine Schriftart mit gleicher Zeichenbreite für alle
Zeichen installieren. Ich befüchte, daß ich was anderes auf dem Monitor
sehe als Du.
Ich hab's mit dem Browser verfasst, über Google gepostet.
Sollte das in dem Fall auch einen Sinn haben, eine andere Schriftart
zu installieren?
Zur Benutzung des Google Webinterfaces zum Usenet bitte ein Schriftart
im Brauser einstellen, die eine Feste Zeichenbreite hat.

Courier, fixed, LucidaConsole und Terminal sind solche Schriften.

HTH, fup2me
Juergen
--
Juergen P. Meier - "This World is about to be Destroyed!"
karl teuschler
2004-11-05 14:22:50 UTC
Permalink
Post by Juergen P. Meier
Courier, fixed, LucidaConsole und Terminal sind solche Schriften.
Danke für den Tipp

Karl
Hauke Laging
2004-11-04 19:17:50 UTC
Permalink
Post by karl teuschler
hallo,
ich habe einen String der zB. so aussieht.
string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string
ermitteln? Hat Jemand eine Idee?
Eine Möglichkeit:

a) Zeichen im Ausgangsstring zählen
b) Zeichenkette löschen
c) Zeichen im neuen String zählen
d) Differenz durch Zeichenkettenlänge teilen
e) Voila


Leicht zu realisieren in bash oder mit sed und wc:

heuhaufen="ab - cde - f"
nadel=" - "
laenge_vorher=${#heuhaufen}
heuhaufen_gekuerzt="${heuhaufen// - /}"
laenge_hinterher=${#heuhaufen_gekuerzt}
laenge_nadel=${#nadel}
differenz=$((laenge_vorher-laenge_hinterher))
anzahl=$((differenz/laenge_nadel))
echo "Anzahl Vorkommnisse: $anzahl"

heuhaufen="ab - cde - f"
nadel=" - "
laenge_vorher=`echo -n "$heuhaufen" | wc -c`
heuhaufen_gekuerzt="`echo -n "${heuhaufen}" | sed -n 's/ - //gp'`"
laenge_hinterher=`echo -n "$heuhaufen_gekuerzt" | wc -c`
laenge_nadel=`echo -n "$nadel" | wc -c`
differenz=`expr $laenge_vorher - $laenge_hinterher`
anzahl=`expr $differenz / $laenge_nadel`
echo "Anzahl Vorkommnisse: $anzahl"


CU

Hauke
--
Helfen Sie Open Source! Petition gegen Softwarepatente
http://petition.eurolinux.org/index_html
Alexander Skwar
2004-11-04 20:30:06 UTC
Permalink
Post by karl teuschler
hallo,
ich habe einen String der zB. so aussieht.
string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?
$ echo -n foo | perl -p -e 's|(.)|\1\n|g'
f
o
o
$ echo -n foo | perl -p -e 's|(.)|\1\n|g' | grep o
o
o
$ echo -n foo | perl -p -e 's|(.)|\1\n|g' | grep o | wc -l
2

$ echo -n "$string" | perl -p -e 's|(.)|\1\n|g' | grep -- - | wc -l
2

Geht auch mit sed

$ echo -n "$string" | sed 's|\(.\)|\1\n|g' | grep -- - | wc -l

$ sed --version
GNU sed Version 4.1.2
Copyright (C) 2003 Free Software Foundation, Inc.
(Der folgende Text ist eine nicht überprüfte Übersetzung, die zur
Information dient; in rechtlichen Fragen ist immer das englische
Original ausschlaggebend)

Dieses Program ist freie Software; In den Quelldateien können Sie die
Bedingungen für die Weitergabe nachlesen.
Es gibt KEINE GARANTIE; nicht einmal die implizite Garantie der
MARKTFÄHIGKEIT oder der ERFÜLLUNG EINES BESTIMMTEN ZWECKES.
$ grep --version
grep (GNU grep) 2.5.1

Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
Dies ist freie Software; in den Quellen befinden sich die Lizenzbedingungen.
Es gibt KEINERLEI Garantie; nicht einmal für die TAUGLICHKEIT oder
VERWENDBARKEIT FÜR EINEN BESTIMMTEN ZWECK.

$ wc --version
wc (coreutils) 5.2.1
Geschrieben von Paul Rubin und David MacKenzie.

Copyright (C) 2004 Free Software Foundation, Inc.
Dies ist freie Software; die Kopierbedingungen stehen in den Quelltexten. Es
gibt keine Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE ZWECKE.

Alexander Skwar
--
Abandon the search for Truth; settle for a good fantasy.
¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Thomas Wolf
2004-11-04 21:39:14 UTC
Permalink
Post by karl teuschler
hallo,
ich habe einen String der zB. so aussieht.
string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?
echo $string | awk '{print gsub(" - ","")}'

Thomas
--
"Das Internet ist urverflucht." (M.W.)
Ralph Angenendt
2004-11-04 22:11:38 UTC
Permalink
Post by karl teuschler
hallo,
ich habe einen String der zB. so aussieht.
string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?
bash:

echo $(($(echo $string|wc -c) - $(echo $string|tr -d '[=-=]'|wc -c)))

| [***@logout ralph]$ string="abschnitt1 - abschnitt2 - abschnit3"
| [***@logout ralph]$ echo $(($(echo $string|wc -c) - $(echo $string|tr
| -d '[=-=]'|wc -c)))
| 2
| [***@logout ralph]$

Warum das '[=-=]' nötig ist bitte in "info tr" nachsehen.

In perl geht das mit tr noch schneller, siehe perldoc perlop unter tr.

Ralph
--
Suchmaschine - Standard - Rückgrat - Stegreif - Toleranz - Platitüde
hören - Paket - asozial - Terabyte - umbrochen - entgelten - intellektuell
Gebaren - Lizenz - delegieren - hältst - spülen - übertakten - lies nach
selbstredend - Algorithmus - Haken - projizieren - nachweislich - voraus - eklig
Stefan Wiens
2004-11-05 00:23:29 UTC
Permalink
Post by Ralph Angenendt
Post by karl teuschler
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?
echo $(($(echo $string|wc -c) - $(echo $string|tr -d '[=-=]'|wc -c)))
| -d '[=-=]'|wc -c)))
| 2
$ string="a - b"
$ echo $(($(echo $string|wc -c) - $(echo $string|tr -d '[=-=]'|wc -c)))
1
$ string="a-b"
$ echo $(($(echo $string|wc -c) - $(echo $string|tr -d '[=-=]'|wc -c)))
1
$

Ein weiteres Opfer eines Proportionalfonts?

Abgesehen davon führt $string (ohne Quotes) dazu, daß beliebiger
Whitespace zu " " wird.
Post by Ralph Angenendt
Warum das '[=-=]' nötig ist bitte in "info tr" nachsehen.
Tut mir leid, aber ich finde dort keine Begründung.
Ralph Angenendt
2004-11-05 12:44:27 UTC
Permalink
Post by Stefan Wiens
$ string="a - b"
$ echo $(($(echo $string|wc -c) - $(echo $string|tr -d '[=-=]'|wc -c)))
1
$ string="a-b"
$ echo $(($(echo $string|wc -c) - $(echo $string|tr -d '[=-=]'|wc -c)))
1
$
Ein weiteres Opfer eines Proportionalfonts?
Das mag sein. Ja, ich bin von "-" ausgegangen.
Post by Stefan Wiens
Post by Ralph Angenendt
Warum das '[=-=]' nötig ist bitte in "info tr" nachsehen.
Tut mir leid, aber ich finde dort keine Begründung.
| However, when `-' is one of those characters, it can be tricky
| because `-' has special meanings. Performing the same task as
| above but also removing all `-' characters, we might try `tr -d
| -axM', but that would fail because `tr' would try to interpret
| `-a' as a command-line option. Alternatively, we could try
| putting the hyphen inside the string, `tr -d a-xM', but that
| wouldn't work either because it would make `tr' interpret `a-x' as
| the range of characters `a'...`x' rather than the three. One way
| to solve the problem is to put the hyphen at the end of the list
| of characters:
|
| tr -d axM-
|
| More generally, use the character class notation `[=c=]' with `-'
| (or any other character) in place of the `c':
|
| tr -d '[=-=]axM'
|
| Note how single quotes are used in the above example to protect the
| square brackets from interpretation by a shell.

Ralph
--
Suchmaschine - Standard - Rückgrat - Stegreif - Toleranz - Platitüde
hören - Paket - asozial - Terabyte - umbrochen - entgelten - intellektuell
Gebaren - Lizenz - delegieren - hältst - spülen - übertakten - lies nach
selbstredend - Algorithmus - Haken - projizieren - nachweislich - voraus - eklig
Stefan Wiens
2004-11-05 15:55:39 UTC
Permalink
Post by Ralph Angenendt
Post by Stefan Wiens
Post by Ralph Angenendt
Warum das '[=-=]' nötig ist bitte in "info tr" nachsehen.
Tut mir leid, aber ich finde dort keine Begründung.
| However, when `-' is one of those characters, it can be tricky
| because `-' has special meanings.
| [...]
| One way to solve the problem is to put the hyphen at the end
|
| tr -d axM-
|
| More generally, use the character class notation `[=c=]' with `-'
|
| tr -d '[=-=]axM'
Dieser Ratschlag ist in meinem Exemplar (noch) nicht enthalten.

Ich halte die Empfehlung für groben Unfug. Es wird der Eindruck
erweckt, die Äquivalenzklasse eines Zeichens sei grundsätzlich
identisch mit dem Zeichen selbst.

Mit LC_COLLATE=C mag das gerade noch gutgehen, andernfalls ist das
Resultat Glückssache:

| 3. This example uses an equivalence class to identify accented
| variants of the base character 'e' in file1, which are stripped of
| diacritical marks and written to file2.
| tr "[=e=]" "[e*]" <file1 >file2


Soll das "-" um jeden Preis aus der Argumentliste heraus:

tr -d '\55'
Stefan Wiens
2004-11-09 18:07:13 UTC
Permalink
Ingrid <***@gmx.net> schrieb:

[ info tr ]
Post by Stefan Wiens
Post by Ralph Angenendt
| More generally, use the character class notation `[=c=]' with `-'
|
| tr -d '[=-=]axM'
Ich halte die Empfehlung für groben Unfug. Es wird der Eindruck
erweckt, die Äquivalenzklasse eines Zeichens sei grundsätzlich
identisch mit dem Zeichen selbst.
Für GNU tr trifft das tatsächlich zu, denn dort hat man die
Äquivalenzklassen einfach fest verdrahtet (1:1), unabhängig von
LC_COLLATE.
Post by Stefan Wiens
tr -d '\55'
Leider funktioniert nicht einmal das zuverlässig mit
GNU tr (GNU textutils) 2.0:

$ echo "Foo-Bar" | tr -d 'a\055z'
F-B
$

SUSv3 sieht es ein wenig anders:

| \octal
| Octal sequences can be used to represent characters with
| specific coded values. An octal sequence shall consist of a
| backslash followed by the longest sequence of one, two, or
| three-octal-digit characters (01234567). The sequence shall
| cause the value whose encoding is represented by the one, two,
| or three-digit octal integer to be placed into the array.
^^^^^^^^^^^^^^^^^^^^^
Leider verschwindet dieses Fehlverhalten auch nicht mit POSIXLY_CORRECT.
"Helmut Waitzmann" (usenet)
2004-11-08 21:11:30 UTC
Permalink
| we might try `tr -d
| -axM', but that would fail because `tr' would try to interpret
| `-a' as a command-line option.
Sollte Dein tr wirklich das command-line option "--" nicht kennen? Das
wäre wirklich sehr schlecht. Oder hat vielleicht nur der Schreiber der
Info-Seiten nicht an "--" gedacht?

In unixartigen Umgebungen ist es üblich, dass Programme das spezielle
command-line option "--" verstehen: Es bedeutet: "Ab hier kommen in der
Parameterliste keine command-line options mehr sondern nur noch normale
Parameter, selbst wenn sie so aussehen, d.h. mit einem "-" beginnen."

Und so verhält sich auch das bei mir installierte tr ((GNU textutils)
2.0):

( a=32
{ while test "$a" -le 126
do
printf '\\0%.3o\0000' "$a"
a="`expr "$a" + 1`"
done
} | \
xargs -0 -e -r -n 1 -- \
sh -c 'printf %b\ "$1"; printf %b\\n "$1" | tr -d -- -axM' sh
)

in einem interaktiven bash eingetippt, liefert bei mir zwei Spalten aller
druckbaren ASCII-Zeichen, wobei an den Stellen "-", "M", "a" und "x" die
rechte Spalte leer ist (ich habe die Ausgabe der Übersichtlichkeit halber
fünfmal vertikal umgebrochen):

0 0 @ @ P P ` ` p p
! ! 1 1 A A Q Q a q q
" " 2 2 B B R R b b r r
# # 3 3 C C S S c c s s
$ $ 4 4 D D T T d d t t
% % 5 5 E E U U e e u u
& & 6 6 F F V V f f v v
' ' 7 7 G G W W g g w w
( ( 8 8 H H X X h h x
) ) 9 9 I I Y Y i i y y
* * : : J J Z Z j j z z
+ + ; ; K K [ [ k k { {
, , < < L L \ \ l l | |
- = = M ] ] m m } }
. . > > N N ^ ^ n n ~ ~
/ / ? ? O O _ _ o o

Könntest Du bitte nachprüfen, ob Dein tr auch das spezielle option "--"
kennt?
--
Wenn Sie mir E-Mail schreiben, stellen | When writing me e-mail, please
Sie bitte vor meine E-Mail-Adresse | precede my e-mail address with
meinen Vor- und Nachnamen, etwa so: | my full name, like
Helmut Waitzmann <***@example.net>, (Helmut Waitzmann) ***@example.net
Stefan Wiens
2004-11-09 05:20:20 UTC
Permalink
Post by "Helmut Waitzmann" (usenet)
| we might try `tr -d
| -axM', but that would fail because `tr' would try to interpret
| `-a' as a command-line option.
Sollte Dein tr wirklich das command-line option "--" nicht kennen? Das
wäre wirklich sehr schlecht. Oder hat vielleicht nur der Schreiber der
Info-Seiten nicht an "--" gedacht?
Daß GNU-only-Hacks bevorzugt genannt werden, ist leider nicht
ungewöhnlich.

Das Herumtricksen um das "-" ist bei den GNU-Tools wegen der
eigentümlichen Auswertung der Argumentliste eigentlich immer
erforderlich; über solche schwerwiegenden Inkompatibilitäten
aber schweigt man sich in der Dokumentation lieber aus:

$ echo foo_bar | tr _r -d
fooba
$ tr --version
tr (GNU textutils) 2.0
Written by Jim Meyering.

Copyright (C) 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ echo foo_bar | POSIXLY_CORRECT= tr _r -d
foo-bad
$
Juergen P. Meier
2004-11-09 06:26:56 UTC
Permalink
Post by Stefan Wiens
Post by "Helmut Waitzmann" (usenet)
Sollte Dein tr wirklich das command-line option "--" nicht kennen? Das
wäre wirklich sehr schlecht. Oder hat vielleicht nur der Schreiber der
Info-Seiten nicht an "--" gedacht?
Wenn es -- nicht kennt, dann ist das kein Tool einer Unix Toolchest
gemaess Unix Standard (Single UNIX Specification Version 3).
Post by Stefan Wiens
Daß GNU-only-Hacks bevorzugt genannt werden, ist leider nicht
ungewöhnlich.
Das ist weder ein GNU-Only Hack, noch uncommon.

Schau bei gelegenheit doch mal in die SUSv3 Standards rein.
(Einzusehen bei der Opengroup: www.unix.org)

Insbesondere basedefs/xbd_chap12.html und functions/getopt.html
duerften dein Misverstaendnis aufklaeren.
Post by Stefan Wiens
$ tr --version
tr (GNU textutils) 2.0
Written by Jim Meyering.
Copyright (C) 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ echo foo_bar | POSIXLY_CORRECT= tr _r -d
foo-bad
Das ist normal. Nach einem Cmdline-Argument, das keine Option
darstellt, kommt keine weiter Option mehr. Hat aber hiermit nichts zu
tun. Es geht hier um sowas wie "echo foo-bar | tr -b +k".

$ showrev -c tr
...
File: /usr/bin/tr
=================
File type: ELF 32-bit MSB executable SPARC Version 1, dynamically
linked, stripped
Command version: SunOS 5.8 Generic 110914-01 January 2001
File mode: r-xr-xr-x
User owning file: root
Group owning file: bin
Library information:
libc.so.1 => /usr/lib/libc.so.1
libdl.so.1 => /usr/lib/libdl.so.1
/usr/platform/SUNW,Ultra-4/lib/libc_psr.so.1
Sum: 58628
...
$ echo 'foo -bar' | /usr/bin/tr -- -b +k
foo +kar

Nicht alles ist ein GNU Hack ;)

HTH,
Juergen
--
Juergen P. Meier - "This World is about to be Destroyed!"
end
If you think technology can solve your problems you don't understand
technology and you don't understand your problems. (Bruce Schneier)
Stefan Wiens
2004-11-09 14:11:45 UTC
Permalink
Post by Juergen P. Meier
Post by Stefan Wiens
Post by "Helmut Waitzmann" (usenet)
Sollte Dein tr wirklich das command-line option "--" nicht kennen? Das
wäre wirklich sehr schlecht. Oder hat vielleicht nur der Schreiber der
Info-Seiten nicht an "--" gedacht?
Wenn es -- nicht kennt, dann ist das kein Tool einer Unix Toolchest
gemaess Unix Standard (Single UNIX Specification Version 3).
Post by Stefan Wiens
Daß GNU-only-Hacks bevorzugt genannt werden, ist leider nicht
ungewöhnlich.
Das ist weder ein GNU-Only Hack, noch uncommon.
Mit GNU-only war natürlich der fragwürdige Rat im Info-File, "[=-=]"
zu verwenden, gemeint. Der Bezug zwischen "GNU-only" und "--" entsteht
erst durch dein Quoting.
Post by Juergen P. Meier
Schau bei gelegenheit doch mal in die SUSv3 Standards rein.
(Einzusehen bei der Opengroup: www.unix.org)
Insbesondere basedefs/xbd_chap12.html und functions/getopt.html
duerften dein Misverstaendnis aufklaeren.
Was "--" angeht, liegt zumindest auf meiner Seite kein Mißverständnis
vor. Aber:

| Guideline 9:
| All options should precede operands on the command line.

Dem widerspricht:

| $ echo foo_bar | tr _r -d
| fooba
Post by Juergen P. Meier
Post by Stefan Wiens
$ tr --version
tr (GNU textutils) 2.0
Written by Jim Meyering.
Copyright (C) 1999 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ echo foo_bar | POSIXLY_CORRECT= tr _r -d
foo-bad
Das ist normal. Nach einem Cmdline-Argument, das keine Option
darstellt, kommt keine weiter Option mehr. Hat aber hiermit nichts zu
tun. Es geht hier um sowas wie "echo foo-bar | tr -b +k".
Natürlich ist das normal. Den unnormalen Fall, nämlich, daß GNU tr
defaultmäßig auch nach einem Argument, das keine Option ist, fröhlich
weiter nach Optionen sucht, hast Du hingegen weggeschnitten.
Juergen P. Meier
2004-11-10 13:24:10 UTC
Permalink
Post by Stefan Wiens
Mit GNU-only war natürlich der fragwürdige Rat im Info-File, "[=-=]"
zu verwenden, gemeint. Der Bezug zwischen "GNU-only" und "--" entsteht
erst durch dein Quoting.
s/dein/dein/ - argh, du hattest in deinem Artikel bereits alles,
was sich auf "[=-=]" bezieht, nicht mitgequotet. Ich bezog mich also
auf deinen Artikel als Alleinstehend.
Post by Stefan Wiens
Was "--" angeht, liegt zumindest auf meiner Seite kein Mißverständnis
vor.
Dann war nur dieses einzelne Posting, auf das ich geantwortet hatte,
missverstaendlich.

Juergen
--
Juergen P. Meier - "This World is about to be Destroyed!"
Stefan Wiens
2004-11-04 22:10:56 UTC
Permalink
Post by karl teuschler
string="abschnitt1 - abschnitt2 - abschnit3"
^^^ ^^^
wie kann ich Anzahl der Zeichenfolge " - " in obigem string ermitteln?
Hat Jemand eine Idee?
echo "$string" | awk -F " - " '{print NF ? NF-1 : 0}'

oder, falls die Eingabe mehrere Zeilen lang sein kann:

echo "$string" | awk -F " - " 'FS{x+=NF-1}END{print x}'
Loading...