这是我尝试使用 sed
在运行 bash
时将一个 b
字符替换为换行符的方法。
$> echo 'abc' | sed 's/b/\n/'
anc
不,那不是它。
$> echo 'abc' | sed 's/b/\\n/'
a\nc
不,那也不是我想要的输出。
a
c
求助!
这是我尝试使用 sed
在运行 bash
时将一个 b
字符替换为换行符的方法。
$> echo 'abc' | sed 's/b/\n/'
anc
不,那不是它。
$> echo 'abc' | sed 's/b/\\n/'
a\nc
不,那也不是我想要的输出。
a
c
求助!
看起来你在使用BSD或Solaris操作系统。尝试以下方法:
[jaypal:~/Temp] echo 'abc' | sed 's/b/\
> /'
a
c
在输入反斜杠并按回车后,完成你的sed
语句。
\n
。 - jaypal singhecho abc | sed 's/b/\'$'\n'/
- 这里的优势是你不必担心复制和粘贴时出现困扰的换行符。 $'\n'
是插入转义序列的一种基于bash的方法。对于sed
来说,看到这个符号时它与Jaypal版本中的是相同的。 - sorpigalsed
要求在替换模式中转义换行符。考虑这个例子:(set -x; echo abc | sed "s/b/\$PATH/")
,它显示了bash
已经解释了\$
,而sed
只看到了$
,与此相比:(set -x; echo abc | sed 's/b/\'$'\n'/)
,它显示了bash
已经扩展了$'\n'
,但是将其前面的反斜杠留给了sed
。为了进行比较,请尝试运行echo abc | sed "s/b/\"$'\n'/
并查看结果。 - sorpigal$ echo 'abc' | sed 's/b/\'$'\n''/'
a
c
$'\n'
会扩展为一个单引号的换行符(见man bash
中的“QUOTING”部分)。这三个字符串在传入sed作为参数之前被连接起来。Sed要求转义换行符,因此我粘贴的代码中有第一个反斜杠。echo 'abc' | sed $'s,b,\\\n,'
更加清晰易懂。 - davidchambers你没有说明你想要全局替换所有的b。如果是的话,你需要用tr
:
$ echo abcbd | tr b $'\n'
a
c
d
在 Solaris 5.8 和 bash 2.03 上对我有效。
在一个多行文件中,我必须通过sed的两侧使用tr命令,如下所示:
echo "$FILE_CONTENTS" | \
tr '\n' ¥ | tr ' ' ∑ | mySedFunction $1 | tr ¥ '\n' | tr ∑ ' '
Unix喜欢剥离换行符、额外的前导空格和各种东西,因为我猜当它在20世纪制作时,这似乎是正确的事情。无论如何,上面展示的方法可以完美解决这个问题。但愿我能在某个地方看到有人发布这个方法,因为这会节省我大约三个小时的时间。
echo 'abc' | sed 's/b/\'\n'/'
你缺少''
来包含\n