40

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

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

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

5 回答 5

39

不,tr专门用于将单个字符替换为单个字符(或者,根据命令行选项,删除字符或将单个字符的运行替换为一次。)。

sed可能是这项特定工作的最佳工具:

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

(请注意,这需要sed将 backlash-n\n序列解释为换行符。GNU sed 会这样做,但POSIX不会指定它,除非在正则表达式中指定它,而且肯定有旧版本sed没有。)

于 2013-08-21T19:45:40.557 回答
6

您可以使用 awk,让 FS/OFS 变量为您完成这项工作:

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

用你的例子测试:

kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345" 
asdlksad ~
 adlkajsd ~
 12345
于 2013-08-21T20:03:58.200 回答
5

tr只能做1对1翻译。

这是使用纯 Bash 的一种方法:

s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
 adlkajsd ~
 12345
于 2013-08-21T20:04:26.350 回答
1

没办法,对不起。

tr意思是用另一个字符音译一个字符。

有很多选择,但我会使用awk,即

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

输出

asdlksad ~
 adlkajsd ~
 12345
于 2013-08-21T19:35:44.133 回答
0
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'

--这将完美运行,因为 sed 在替换 \n 时遇到问题

于 2015-06-19T12:12:56.880 回答