如何向文件中的任何 `{` 和 `:` 字符添加换行符

How add to any `{` and `:` character in a file a newline

我想将给定的文本文件(通常在 macOS 或 Unix 上)复制到标准输出,其中向任何 {: 字符添加换行符。

我试过了

sed “s/{/{\n/g” myfile.txt 

只是为了大括号字符,但这似乎不起作用。

我需要为此安装 GNU 版本的 sed 吗?如果是这样,我如何一次性向两个字符 {: 添加换行符?

只需反斜杠文字换行符即可。

catalina$ sed 's/[{:]/\
> /'g <<\_
> hello: this{is} an example{of}something: poo
> there
> _
hello
 this
is} an example
of}something
 poo
there

如果您想用自身替换匹配的字符,请在替换中包含 &

catalina$ sed 's/[{:]/&\
/'g <<\_
> hello: this is {another} example
> more: newlines!
> here
> _
hello:
 this is {
another} example
more:
 newlines!
here

关于 exactly 这在 exactly 哪个 sed 版本中的工作方式有很多变化,但我相信上面应该到处工作。 GNU sed 增加了一些便利,比如可以使用 \n 作为换行符的缩写,但这不是可移植的。一般来说,如果您需要使用不可移植的 sed 功能,我建议您转向 Awk 或 Perl。

有时您也可以使用 shell 功能,例如 sed $'s/[{:]/\\n/g' 但这(目前)是 Bash 特定的,并且可能不会在易读性方面有所改进。 (简而言之,$'...' 提供了一个带有“C 字符串”语义的单引号字符串,这意味着 shell\n 转换为文字换行符, \t 到文字选项卡等;然后您还需要用另一个反斜杠转义文字反斜杠,以防止 shell 将其解释为其他内容。建议使用此 shell 功能包含在未来的 POSIX 版本中,因此它最终将可移植到任何符合 POSIX 的 shell,但请不要屏住呼吸。)

如果不是很明显,[{:] 是一个正则表达式 字符 class 匹配方括号之间枚举中的单个字符。

这可能适合你:

sed '/[{:]/G;//s/\([{:]\)\(.*\)\(.\)$//;P;D' file

如果一行包含 {:,则向其附加一个空行并使用模式匹配在匹配模式和该行的其余部分之间插入该换行符。

Print/delete 模式中的第一行 space 并重复。

N.B。 D 命令最多删除并包括模式 space 中的第一个换行符,如果模式 space 仍然包含文本,则禁止 sed 循环替换模式 space下一行。因此可以处理剩余的文本。