tr命令能否将一个字符替换为两个字符?
我正在尝试将“〜”替换为“〜\n”,但输出结果没有产生换行符。
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
不,tr
专门用于将单个字符替换为单个字符(或根据命令行选项删除字符或将连续的单个字符替换为一个字符)。
sed
可能是这个特定工作的最佳工具:
$ echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~\n/g'
asdlksad ~
adlkajsd ~
12345
(请注意,这需要sed
将反斜杠-n \n
序列解释为换行符。GNU sed可以做到这一点,但POSIX除了在正则表达式中指定之外,并没有规定它,而且肯定存在较旧版本的sed
不支持该功能。)
tr
只能进行一对一的翻译。
以下是使用纯 Bash 的一种方法:
s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
adlkajsd ~
12345
awk -F'~' -v OFS="~\n" '$1=$1'
使用您的示例进行测试:
kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
tr
旨在将一个字符转换为另一个字符。awk
。echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
output
asdlksad ~
adlkajsd ~
12345
/[~]/
,更短的形式/~/
也可以。末尾的;1
并非必需的。(或者对于某些古老的操作系统而言是必需的吗?) - Roland Illigecho "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
--这将完美地工作,因为sed在替换\n时存在问题
|
,它就无法工作。 - Roland Illig