可以用两个字符替换一个字符吗?
我试图用“〜\ n”替换“〜”,但输出不会产生换行符。
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
答案 0 :(得分:23)
不,tr
专门用于将单个字符替换为单个字符(或者,根据命令行选项,删除字符或将一个字符的运行替换一次。)。
sed
可能是这项工作的最佳工具:
$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
adlkajsd ~
12345
(请注意,这需要sed
将backlash-n \n
序列解释为换行符.GNU sed执行此操作,但POSIX除了常规之外不指定它表达式,肯定有sed
的旧版本没有。)
答案 1 :(得分:3)
你可以使用awk,让FS / OFS变量为你完成工作:
awk -F'~' -v OFS="~\n" '$1=$1'
用你的例子测试:
kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
答案 2 :(得分:1)
不能做,抱歉。
tr
用于将一个字符音译为另一个字符。
有很多选项,但我会使用awk
,即
echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
<强>输出强>
asdlksad ~
adlkajsd ~
12345
答案 3 :(得分:1)
tr
只能进行1对1的翻译。
以下是使用纯Bash执行的一种方法:
s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
adlkajsd ~
12345
答案 4 :(得分:0)
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
- 这将完美,因为sed有问题替换\ n