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

Pao*_*olo 24 unix shell tr

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

我试图用"〜\n"替换"〜",但输出不会产生换行符.

$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
Run Code Online (Sandbox Code Playgroud)

Kei*_*son 26

不,tr是专门用来替换单个字符由单个字符(或根据命令行选项,要删除的字符或由一个发生代替单个字符的运行.).

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

$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
 adlkajsd ~
 12345
Run Code Online (Sandbox Code Playgroud)

(注意,这需要sed将backlash-n \n序列解释为换行符.GNU sed执行此操作,但POSIX除了在正则表达式中之外没有指定它,并且肯定有旧版本的sed那些.)


anu*_*ava 7

tr只能做1对1翻译。

这是使用纯 Bash实现此目的的一种方法:

s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
 adlkajsd ~
 12345
Run Code Online (Sandbox Code Playgroud)

  • 请在此处查看语法的详细解释:/sf/answers/924763661/ (2认同)

Ken*_*ent 6

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

awk -F'~' -v OFS="~\n" '$1=$1' 
Run Code Online (Sandbox Code Playgroud)

用你的例子测试:

kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345" 
asdlksad ~
 adlkajsd ~
 12345
Run Code Online (Sandbox Code Playgroud)

  • 这为我解决了一个问题,但我不清楚发生了什么,所以为了清楚起见,我更深入地挖掘了一些:“-F”==“输入字段分隔符”和“-OFS”==“输出字段分隔符” " (这里的技巧是“OFS”可以是多字符)并且“&lt;&lt;&lt;”将带引号的字符串作为 STDIN(在同一个 shell 中)传递给 awk - 这避免了完成事务的管道的问题在不同的子外壳中。 (2认同)