Как заменить один символ двумя символами, используя tr

Может ли tr заменить один символ двумя символами?

Я пытаюсь заменить "~" на "~\n", но вывод не создает новую строку.

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

Ответ 1

Нет, tr специально предназначен для замены отдельных символов одиночными символами (или, в зависимости от параметров командной строки, для удаления символов или замены прогонов одного символа одним вхождением.).

sed, вероятно, лучший инструмент для этой конкретной работы:

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

(Обратите внимание, что для этого требуется, чтобы sed интерпретировал последовательность зазор-n \n как символ новой строки. GNU sed делает это, но POSIX не указывает его, кроме как в пределах регулярного выражения, и есть определенно более старые версии sed которые не.)

Ответ 2

вы можете пойти с awk, пусть переменная FS/OFS выполнит эту работу для вас:

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

тест с вашим примером:

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

Ответ 3

нет бывает, извините.

tr означает транслитерировать один символ с другим.

существует множество вариантов, но я бы использовал awk, т.е.

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

вывод

asdlksad ~
 adlkajsd ~
 12345

Ответ 4

tr может выполнять только 1 к 1 перевод.

Вот один из способов сделать это, используя чистый Bash:

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

Ответ 5

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

--This будет работать отлично, так как sed имеет проблему, заменяющую \n