file - 如何在unix文件中的第4个管道之前和最后一个双引号之后添加\ n
问题描述
我在文件中有一行。像:
- 1|4|ab|"abnchf "dnvjnkjf" fdvjnfkjnv" 2|12|df|"dskfnkfv "A"
我想通过在第 4 个管道之前和最后一个双引号之后添加 \n 将其分成两行。
它应该是这样的:
1|4|ab|"abnchf "dnvjnkjf" fdvjnfkjnv"
2|12|df|"dskfnkfv "A"
我试过 sed 命令,但它不起作用
sed 's/\(|[^|]*\)(|[^|]*\)(|[^|]*\)|/\1\n|/g'
解决方案
您可以使用
sed 's/\([^|]*|\)\{3\}[^|]* /&\n/' file > newfile
查看在线演示
细节
\([^|]*|\)\{3\}
- 三个连续出现[^|]*
- 0+ 以外的字符|
|
- 管道符号
[^|]*
- 0+ 以外的字符|
替换模式是&\n
,整个匹配 ( &
) 和换行符 ( \n
)。
g
由于我删除了该选项,因此每行仅进行一次替换。
为避免过度转义,您可以使用基于 POSIX ERE 的sed
:
sed -E 's/([^|]*\|){3}[^|]* /&\n/' file > newfile
您不需要转义捕获括号和范围/间隔量词大括号(但您必须转义文字|
字符)。
推荐阅读
- python-3.x - 虽然循环没有像 Python 中预期的那样在基本情况下终止
- postgresql - 如何在 postgres 查询中嵌套查询
- sql - 在 Oracle SQl 中拆分日期和时间
- elixir - 混合版本“start_iex”显示错误,而“start”不显示
- java - log4j-to-slf4j 没有拾取 log4j2.xml
- linux - 未加载 vboxdrv 内核模块(Unknown rela relocation - debian buster)
- java - Azure Dev Ops 管道 java 项目
- php - PHP电子邮件代码不以HTML格式发送电子邮件
- css - 如何在 Bootstrap v 4.5.x CDN 中启用 RFS
- c# - Azure Functions 事件中心读写延迟峰值与 StorageException 和 SocketException 峰值