【问题标题】:how to add \n before 4th pipe and after last double Quotes in a file in unix如何在unix文件中的第4个管道之前和最后一个双引号之后添加\ n
【发布时间】:2019-02-17 00:41:23
【问题描述】:

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

  • 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' 

【问题讨论】:

  • @AndrewMairose 这仅适用于 POSIX ERE 和类似 Perl 的正则表达式。在 BRE POSIX 模式中,| 匹配文字 | 字符。

标签: file unix sed


【解决方案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

您不需要转义捕获括号和范围/间隔量词大括号(但您必须转义文字 | 字符)。

【讨论】:

【解决方案2】:

这可能对你有用(GNU sed):

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-05
    • 2019-08-08
    • 2011-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多