Shell 如何使用tr将一个字符替换为两个字符

Shell 如何使用tr将一个字符替换为两个字符,shell,unix,tr,Shell,Unix,Tr,tr可以用两个字符替换一个字符吗 我试图用“~\n”替换“~”,但输出不生成换行符 $ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n" asdlksad ~ adlkajsd ~ 12345 不行,对不起 tr意指将一个字符与另一个字符进行音译 有很多选择,但我会使用awk,即 echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1' 输出 asdlksad

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

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

$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
不行,对不起

tr
意指将一个字符与另一个字符进行音译

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

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

asdlksad ~
 adlkajsd ~
 12345

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

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

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

(请注意,这需要
sed
将resack-n
\n
序列解释为换行符。GNU-sed会这样做,但除了在正则表达式中之外,不会指定它,而且肯定有较旧版本的
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

kent$awk-F'~'-vofs=“~\n”'$1=$1'
tr
只能进行1对1的翻译

下面是使用纯Bash实现这一点的一种方法:

s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
 adlkajsd ~
 12345

--这将非常有效,因为sed在替换时遇到问题\n

如果输入的其他地方包含
,它将不起作用。除了
/[~]/
,较短的
/~/
格式也可以工作。
;1结尾处的
不是必需的。(或者是,对于一些模糊的旧操作系统来说?)这为我解决了一个问题,但我不清楚到底发生了什么,所以我更深入地挖掘了一些细节:“-F”==“输入字段分隔符”和“-OFS”==“输出字段分隔符”(这里的技巧是“OFS”可以是多字符)和“这可能比调用awk或sed等实用程序更有效。请参阅此处的语法解释:
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'