webentwicklung-frage-antwort-db.com.de

So ersetzen Sie ein Zeichen durch zwei Zeichen mit tr

Kann tr ein Zeichen durch zwei Zeichen ersetzen?

Ich versuche, "~" durch "~\n" zu ersetzen, aber die Ausgabe erzeugt keinen Zeilenumbruch. 

$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
21
Paolo

Nein, tr soll insbesondere einzelne Zeichen durch einzelne Zeichen ersetzen (oder je nach Befehlszeilenoptionen Zeichen löschen oder Läufe eines einzelnen Zeichens durch ein Vorkommen ersetzen).

sed ist wahrscheinlich das beste Werkzeug für diesen speziellen Job:

$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
 adlkajsd ~
 12345

(Beachten Sie, dass dies sed erfordert, um die Backlash-n \n-Sequenz als Zeilenumbruchzeichen zu interpretieren. GNU sed macht dies, aber POSIX gibt sie nur innerhalb eines regulären Ausdrucks an und gibt es definitiv ältere Versionen von sed, die das nicht tun.)

22
Keith Thompson

sie könnten mit awk gehen, lassen Sie FS/OFS-Variable die Arbeit für Sie erledigen:

awk -F'~' -v OFS="~\n" '$1=$1' 

teste mit deinem Beispiel:

kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345" 
asdlksad ~
 adlkajsd ~
 12345
3
Kent

tr kann nur 1 zu 1 übersetzen.

Hier ist eine Möglichkeit, dies zu tun mit Pure Bash:

s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
 adlkajsd ~
 12345
1
anubhava

nein, tut mir leid.

tr soll ein Zeichen mit einem anderen transliterieren.

es gibt zahlreiche Optionen, aber ich würde awk verwenden, d. h.

echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'

Ausgabe

asdlksad ~
 adlkajsd ~
 12345
1
shellter
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'

- Dies funktioniert einwandfrei, da sed ein Problem beim Ersetzen von\n hat

0
Samanway