如何使用tr替换一个带有两个字符的字符

时间:2013-08-21 18:55:34

标签: shell unix tr

可以用两个字符替换一个字符吗?

我试图用“〜\ n”替换“〜”,但输出不会产生换行符。

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

5 个答案:

答案 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