如何在第四个管道之前添加\ n,在unix中的文件中添加最后一个双引号之后

问题描述 投票:1回答:2

我在文件中有一行。喜欢:

  • 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' 
file unix sed
2个回答
1
投票

你可以用

sed 's/\([^|]*|\)\{3\}[^|]* /&\n/' file > newfile

online demo

细节

  • \([^|]*|\)\{3\} - 三个连续出现的 [^|]* - 除了|之外的0+个字符 | - 管道符号
  • [^|]* - 除了|之外的0+个字符
  • - 一个空间

替换模式是&\n,整个匹配(&)和换行符(\n)。

由于我删除了g选项,因此每行只进行一次替换。

为避免过度使用,您可以使用基于POSIX ERE的sed

sed -E 's/([^|]*\|){3}[^|]* /&\n/' file > newfile

你不需要逃避捕获括号和范围/区间量词大括号(但你必须逃避文字|字符)。


0
投票

这可能适合你(GNU sed):

sed 's/[^ |]*|/\n&/4' file

|分隔的第四个字段之前插入换行符。

© www.soinside.com 2019 - 2024. All rights reserved.