tr 可以用两个字符替换一个字符吗?
我试图用“~\n”替换“~”,但输出不会产生换行符。
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
不,tr
专门用于将单个字符替换为单个字符(或者,根据命令行选项,删除字符或将单个字符的运行替换为一次。)。
sed
可能是这项特定工作的最佳工具:
$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
adlkajsd ~
12345
(请注意,这需要sed
将 backlash-n\n
序列解释为换行符。GNU sed 会这样做,但POSIX不会指定它,除非在正则表达式中指定它,而且肯定有旧版本sed
没有。)
您可以使用 awk,让 FS/OFS 变量为您完成这项工作:
awk -F'~' -v OFS="~\n" '$1=$1'
用你的例子测试:
kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
tr
只能做1对1翻译。
这是使用纯 Bash 的一种方法:
s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
adlkajsd ~
12345
没办法,对不起。
tr
意思是用另一个字符音译一个字符。
有很多选择,但我会使用awk
,即
echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
输出
asdlksad ~
adlkajsd ~
12345
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
--这将完美运行,因为 sed 在替换 \n 时遇到问题