在 Linux 环境中,可以直接使用如下命令:
echo "a,b,c" | sed 's/,/\n/g'
直接完成行转列的输出;但是此命令在 OS X 环境中无法正常运行;本文对此问题进行了简单的研究实践;
在 Linux 环境中可以使用如下命令直接完成字符串的处理:
echo "a,b,c" | sed 's/,/\n/g'
a
b
c
但是在 os x 环境中得到的输出如下:
#
echo "a,b,c" | sed 's/,/\n/g'
anbnc
可以肯定的是 \n
被解析为了转义字符,即字符 n
本身,再试试 \\\n
echo "a,b,c" | sed 's/,/\\\n/g'
a\nb\nc
即:\\\n
被解析成了两个转义字符:\\
和 \n
,最终要替换的结果字符为:\n
的字面值.也就是上面的输出结果;
此时,在 's/,/\\\n/g'
前面加一个:$
,即:$'s/,/\\\n/g'
echo "a,b,c" | sed $'s/,/\\\n/g'
a
b
c
解释:
$'s/,/\\\n/g'
首先会进行一次字面值解释并输出.因此 $'s/,/\\\n/g'
等价于:
's/,/\换行符/g',看下面的代码输出:
$'s/,/\\\n/g'
bash: s/,/\
/g: No such file or directory
等价于执行了解释后得到了一串字面字符串:s/,\换行/g
,字面值 换行
在 shell 中进行了实际换行. 加上前面的 sed 命令,那这个经过解释的字面字符串就不是一个单一的命令,而是作为 sed 的参数.这样字符串中的换行(\n
).就不是一个输入的一个换行(\n
),而是 sed 参数中的用来代替 ,
的目标字符:\n
;
需要说明的是,此种写法在 类 Linux 的系统上也是可以生效的,因此这种写法虽然看起来有些怪.但是更具有通用性;❤️ 最后还有一种写法如下,这个暂没有理解.先记在此!
echo 'foo bar' | sed -e 's/ /\'$'\n/g'
上面已经提到此类差异是由于使用了不同版本的 sed
造成的.因此也可以在 OS X 上安装一个 GNU
版本的 sed
:
参考:
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于