2016-04-13 19 views
2

Sagen Sie, ich versuche, Zeilenumbrüche oder Zeilenumbrüche zu löschen. Ich merke, dass wenn ich Transliterate verwende, um die Zeilenumbruch Zeichen tr -d '\n' zu löschen, bekomme ich die gleichen Ergebnisse, als ob ich tr -d $"\n" oder tr -d $'\n' wäre. Was ist der Unterschied?In welchen Fällen sollte ich Dollarzeichen und einfache Anführungszeichen in der Transliteration (zB tr-d ' n') oder eine andere Funktion verwenden?

Ich bin nicht sicher, wie das gleiche in sed oder Grep gilt, weil sie komplizierter sind. Also versuche ich zuerst herauszufinden, dass dies ein einfacheres Bash-Programm zu sein scheint.

+2

Ohne das '$' ist es 'tr', das das Newline-Zeichen erzeugt, mit dem' $ 'ist es bash. 'tr' ist * nicht * ein" bash-Programm ", es hat nichts mit der Shell zu tun, abgesehen davon, dass es normalerweise von bash ausgeführt wird. – cdarke

+0

Würdest du es ein Bash-Dienstprogramm nennen? – Tom

+0

Ich würde es einfach ein Dienstprogramm nennen. Ich kenne seine einzige Semantik, aber diese Programme können von jeder Sprache aus aufgerufen werden, sie sind nicht an Bash gebunden. Natürlich sind sie so entworfen, dass sie von einer Shell aufgerufen werden, also wäre das "Shell Utility Program" nicht so schlecht. Die meisten dieser Programme (die ursprünglichen Versionen sowieso) sind vor ca. 20 Jahren fertiggestellt. Es ist wichtig zu erkennen, dass es sich um separate Programme handelt, die den gesamten Aufwand für die Ausführung in einem separaten Prozess haben. – cdarke

Antwort

5

tr hat sein eigenes Entkommen:

  • Wenn Sie tr -d '\n' schreiben, das tr Programm selbst erkennt \ + n und eine neue Zeile ersetzt.
  • Wenn Sie tr -d $'\n' schreiben, konvertiert Bash \n zu einem Newline-Zeichen, und tr sieht es wörtlich.

Wenn Sie experimentieren zu verstehen, was die Shell tut, dann ist es wahrscheinlich lohnt sich ein kurzes C-Programm auszuschreiben jedes Argument Buchstaben für Buchstaben drucken - so etwas wie:

#include <stdio.h> 

int main(int argc, char **argv) 
{ 
    int i; 

    /* Ignore argv[0] - the program name is not interesting */ 
    for (i = 1; i < argc; ++i) { 
     char *p = argv[i]; 
     printf("argv[%d] =", i); 
     while (*p) 
      printf(" %3d", (int)*p++); 
     printf("\n"); 
    } 

    return 0; 
} 

diesem einen druckt in Dezimal, aber es ist einfach, es zu ändern, um hex oder oktal zu verwenden. Laufen mit $'\n'\n"\n" als Argument gibt:

argv[1] = 10 
argv[2] = 110 
argv[3] = 92 110 

das zeigt, dass im ersten Fall, Schlag passiert ein einziges Zeilenende-Zeichen, in dem zweiten Fall nur die ‚n‘, und in dem letzten Fall wird sowohl ' \ 'und' n '.

+0

Sie brauchen nicht C, um dies zu sehen. Einfach 'set -x' und' printf': 'set -x; printf% q \\ n \ n '\ n' $ '\ n''. Oder um eine ähnlichere Ausgabe zu erhalten: 'printf% d \\ n \ '\ n \' '\ n' \ '$' \ n''. Obwohl dieser zweite nur den Code für den Schrägstrich im zweiten Fall zeigt. –

+0

Wow, ich wusste nicht, tr hat seine eigenen Escapezeichen – Tom

+0

Ist tr eine einzigartige Ausnahme, oder machen andere Bash-Tools dies auch? – Tom