我想将给定的文本文件(通常在 macOS 或 Unix 上)复制到标准输出,其中任何{和:字符都添加了换行符。
我试过
sed “s/{/{\n/g” myfile.txt
仅用于大括号字符,但这似乎不起作用。
我需要为此安装 sed 的 GNU 版本吗?如果是这样,我怎样才能一次性为两个字符添加 {换行符: ?
我想将给定的文本文件(通常在 macOS 或 Unix 上)复制到标准输出,其中任何{和:字符都添加了换行符。
我试过
sed “s/{/{\n/g” myfile.txt
仅用于大括号字符,但这似乎不起作用。
我需要为此安装 sed 的 GNU 版本吗?如果是这样,我怎样才能一次性为两个字符添加 {换行符: ?
只需反斜杠文字换行符。
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
尽管我相信上面的内容应该适用于任何地方,但它在哪个版本中究竟是如何工作的有很多变化。sedGNUsed增加了一些便利,比如可以\n用作换行符的缩写,但这不是可移植的。sed一般来说,如果您需要使用不可移植的特性,我建议您使用 Awk 或 Perl 。
有时您也可以使用类似的 shell 功能,sed $'s/[{:]/\\\n/g'但这(目前)是特定于 Bash 的,并且在易读性方面可能没有改进。(简而言之,$'...'提供具有“C 字符串”语义的单引号字符串,这意味着shell转换\n为文字换行符、\t文字制表符等;然后您还需要使用另一个反斜杠来转义文字反斜杠以防止 shell将其解释为其他内容。建议将此 shell 功能包含在未来的 POSIX 版本中,因此它最终将可移植到任何符合 POSIX 的 shell,但不要屏住呼吸。)
如果不明显,[{:]是一个正则表达式字符类,它匹配方括号之间的枚举中的单个字符。
这可能对您有用:
sed '/[{:]/G;//s/\([{:]\)\(.*\)\(.\)$/\1\3\2/;P;D' file
如果一行包含{or :,则在其上附加一个空行并使用模式匹配在匹配模式和该行的其余部分之间插入该换行符。
打印/删除模式空间中的第一行并重复。
NB 该D命令删除模式空间中的第一个换行符(包括第一个换行符),如果模式空间仍然包含文本,则禁止 sed 循环用下一行替换模式空间。因此可以处理剩余的文本。