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
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.)
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
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
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
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
- Dies funktioniert einwandfrei, da sed ein Problem beim Ersetzen von\n hat