Как заменить один символ двумя символами, используя 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