2013-08-21 7 views
13

Czy można zastąpić jedną postacią dwoma znakami?tr: zamiana jednego znaku na dwa znaki

Próbuję zastąpić "~" przez "~ \ n", ale dane wyjściowe nie generują znaku nowej linii.

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

Odpowiedz

11

Nie, tr jest specjalnie przeznaczony do wymiany pojedynczych znaków przez pojedynczych znaków (lub, w zależności od w opcjach wiersza poleceń, aby usunąć znaki lub zamienić przebiegi pojedynczego znaku o jedno wystąpienie.).

sed jest prawdopodobnie najlepszym narzędziem do tego konkretnego zadania.

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

(Zauważ, że wymaga sed to interpretować luz-n \n sekwencję jako znak nowej linii GNU sed to robi, ale POSIX robi” t. określił go z wyjątkiem wewnątrz wyrażenia regularnego, a na pewno są starsze wersje sed że nie)

0

Nie można zrobić, przepraszam.

tr służy do transliteracji jednej postaci z drugą.

istnieje wiele opcji, ale chciałbym używać awk, tj

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

wyjście

asdlksad ~ 
adlkajsd ~ 
12345 
2

można przejść z awk, niech zmiennej FS/OFS wykonać zadanie dla Ciebie:

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

Test z przykładu:

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

tr może to zrobić tylko 1 do 1 tłumaczenie.

Oto jeden ze sposobów na osiągnięcie tego użyciu czystego Bash:

s='"asdlksad ~ adlkajsd ~ 12345' 
r=$'~\n' 
echo -e "${s//\~/$r}" 
asdlksad ~ 
adlkajsd ~ 
12345 
2
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n' 

--This zadziała idealny, ponieważ sed problem zastępując \ n

Powiązane problemy