【发布时间】:2013-08-21 18:55:34
【问题描述】:
可以用两个字符替换一个字符吗?
我正在尝试将“~”替换为“~\n”,但输出不会产生换行符。
$ echo "asdlksad ~ adlkajsd ~ 12345" | tr "~" "~\n"
asdlksad ~ adlkajsd ~ 12345
【问题讨论】:
可以用两个字符替换一个字符吗?
我正在尝试将“~”替换为“~\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 没有。)
【讨论】:
您可以使用 awk,让 FS/OFS 变量为您完成这项工作:
awk -F'~' -v OFS="~\n" '$1=$1'
用你的例子测试:
kent$ awk -F'~' -v OFS="~\n" '$1=$1' <<< "asdlksad ~ adlkajsd ~ 12345"
asdlksad ~
adlkajsd ~
12345
【讨论】:
tr只能进行1对1翻译。
这是一种使用纯 Bash 的方法:
s='"asdlksad ~ adlkajsd ~ 12345'
r=$'~\n'
echo -e "${s//\~/$r}"
asdlksad ~
adlkajsd ~
12345
【讨论】:
没办法,抱歉。
tr 是一个字符与另一个字符的音译。
有很多选择,但我会使用awk,即
echo "asdlksad ~ adlkajsd ~ 12345" | awk '{gsub(/[~]/, "&\n")};1'
输出
asdlksad ~
adlkajsd ~
12345
【讨论】:
/[~]/,更短的形式/~/ 也可以使用。最后的;1 不是必需的。 (或者,对于一些不起眼的旧操作系统?)
echo "asdlksad ~ adlkajsd ~ 12345" | sed 's/~/~|/g' | tr '|' '\n'
--这将完美运行,因为 sed 在替换 \n
时遇到问题【讨论】:
|则不起作用。