如何解决如何向文件中的任何`{` 和`:` 字符添加换行符
我想将给定的文本文件(通常在 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
版本中的exactly 有很多变化,尽管我相信上述方法应该适用于任何地方。 GNU sed
增加了一些便利,例如能够使用 \n
作为换行符的缩写,但这不是可移植的。一般来说,如果您需要使用不可移植的 sed
功能,我建议您改用 Awk 或 Perl。
有时您也可以使用像 sed $'s/[{:]/\\\n/g'
这样的 shell 功能,但这(目前)是 Bash 特定的,在易读性方面可能没有改进。 (简而言之,$'...'
提供具有“C 字符串”语义的单引号字符串,这意味着 shell 将 \n
转换为文字换行符,\t
转换为文字制表符等;然后您还需要用另一个反斜杠转义文字反斜杠,以防止 shell 将其解释为其他东西。建议将此 shell 功能包含在未来的 POSIX 版本中,因此它最终将可移植到任何符合 POSIX 的 shell,但不要屏住呼吸。)
如果不明显,[{:]
是一个正则表达式字符类,它匹配方括号之间的枚举中的单个字符。
这可能对您有用:
sed '/[{:]/G;//s/\([{:]\)\(.*\)\(.\)$/\1\3\2/;P;D' file
如果一行包含 {
或 :
,则向其追加一个空行并使用模式匹配在匹配模式和该行的其余部分之间插入该换行符。
打印/删除模式空间中的第一行并重复。
注意D
命令最多删除并包括模式空间中的第一个换行符,如果模式空间仍然包含文本,则禁止 sed 循环用下一行替换模式空间。从而可以处理剩余的文本。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。