it-swarm.com.de

Was ist eine praktische Möglichkeit, jedes in einer Datei verwendete Zeichen aufzulisten (Bash) (Regex)

Wie kann ich das drehen:

Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.

Dazu:

 abcdefghiklnoprstuwFJT',():.

(Dies sind die in der Eingabe verwendeten Gesamtzeichen.)

Bitte beachten Sie, dass die Kleinbuchstaben "jmqvz" nicht im Eingabesatz enthalten sind und daher nicht ausgegeben werden.

Die Reihenfolge spielt keine Rolle, es werden jedoch Kleinbuchstaben, Großbuchstaben und Sonderzeichen bevorzugt.

Ich bin mir sicher, dass ich sed/awk/etc brauche. dafür habe ich aber nach ausgiebiger suche nichts ähnliches gefunden.

3
TuxForLife

Sie können eine Kombination aus sed und sort verwenden:

_$ echo "Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef." | 
>  sed 's/./&\n/g' | LC_COLLATE=C sort -u | tr -d '\n'
 '(),.:FJTabcdefghiklnoprstuwxy
_

sort sortiert lexikografisch. Sehen Sie sich also man 7 ascii an, um die Reihenfolge der Zeichen zu bestimmen.

Erläuterung:

  • _sed 's/./&\n/g'_ - füge nach jedem Zeichen eine neue Zeile ein, da sort (normalerweise) zeilenweise sortiert
  • _LC_COLLATE=C_ setzt den Kollatierungsstil auf C (siehe Was macht “LC_ALL = C”? )
  • _sort -u_: Sortiert die Eingabe und druckt nur die eindeutigen Einträge
  • _tr -d '\n'_ löscht alle zusätzlichen neuen Zeilen.

Wenn Sie nur sichtbare Zeichen behalten möchten:

_$ echo "Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef." | 
> tr -cd '[[:graph:]]' | sed 's/./&\n/g' | LC_COLLATE=C sort -u | tr -d '\n'
_
  • _tr -cd '[[:graph:]]'_ löscht alles außer sichtbaren Zeichen.
11
muru

Sie können jedes Zeichen einer Datei in einer separaten Zeile mit fold -w1 drucken, dann die Ausgabe sortieren und die Duplikate mit sort -u (oder sort | uniq) entfernen:

$ cat test 
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.
$ fold -w1 test | sort -u

,
:
.
'
(
)
a
b
c
d
e
f
F
g
h
i
J
k
l
n
o
p
r
s
t
T
u
w
x
y

Dann können Sie das wieder in eine einzelne Zeile umwandeln, zum Beispiel mit einem paste -sd "" -:

$ fold -w1 test | sort -u | paste -sd "" -
 ,:.'()abcdefFghiJklnoprstTuwxy
8
Nykakin

Oh, Spaß! Hier sind ein paar Möglichkeiten. Die einfachste (fold) wurde bereits angegeben, aber hier ist eine Möglichkeit, diese zu erweitern, um auch die Anzahl für jedes Zeichen anzugeben:

$ fold -w 1 file | LC_ALL=C sort  | uniq -c
 11  
  2 "
  1 '
  1 (
  1 )
  3 ,
  1 .
  1 :
  1 F
  1 J
  1 T
  1 a
  1 b
  2 c
  2 d
  9 e
  4 f
  2 g
  4 h
  5 i
  1 k
  3 l
  7 n
  6 o
  1 p
  2 r
  4 s
  1 t
  2 u
  1 w
  1 x
  1 y

Die Verwendung von LC_ALL=C setzt das Gebietsschema für den Befehl sort auf C, was bedeutet, dass GROSSBUCHSTABEN vor Kleinbuchstaben sortiert werden, wie Sie es gewünscht haben. Wenn Sie alles in derselben Zeile anzeigen möchten, ohne die Vorkommen zu zählen, aber mit derselben Sortierreihenfolge, können Sie dies tun

$ echo $(fold -w 1 file | LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJTabcdefghiklnoprstuwxy

Sie könnten auch Perl verwenden:

$ Perl -lne '$k{$_}++ for split(//); END{print sort keys(%k)}' file
"'(),.:FJTabcdefghiklnoprstuwxy

Schließlich gibt es eine Möglichkeit, Sonderzeichen wie Tabulatoren, Zeilenumbrüche und Zeilenumbrüche anzuzeigen:

$ echo $(od -c file | grep -oP "^\d+ +\K.*" | tr -s ' ' '\n' | 
    LC_ALL=C sort -u | tr -d '\n')
"'(),.:FJT\n\r\tabcdefghiklnoprstuwxy
          ------
            |-------------> special characters
3
terdon

Entfernen Sie einfach die doppelten Zeichen aus der Eingabezeichenfolge. Die Funktion set in python erstellt eine Reihe von Elementen ohne Duplikate. Das heißt, set('ssss') gibt Ihnen ein einzelnes s.

Durch Python3

$ cat file
Johnny's penguin, (Tuxie), likes the following foods: French fries, and beef.

$ python3 -c 'import sys
with open(sys.argv[1]) as f:
    for line in f:
        print("".join(sorted(set(line))))' file
 '(),.:FJTabcdefghiklnoprstuwxy

Wenn Sie die doppelten Zeichen in der gesamten Datei entfernen möchten, können Sie dies versuchen.

$ python3 -c 'import sys
with open(sys.argv[1]) as f:
    print("".join(sorted(set(f.read()))))' file
2
Avinash Raj