【问题标题】:Parse file and insert new line after each occurrence解析文件并在每次出现后插入新行
【发布时间】:2020-06-21 08:13:38
【问题描述】:

在 Unix 系统上,我尝试使用 sedperl 在文件中添加新行,但我似乎遗漏了一些东西。

假设我的文件有多行文本,总是像{TNG:}}${1:F01 这样结束。

我正在尝试找到一种在}$ 之后添加新行的方法,这样{1 应该总是从新行开始。

我通过转义 $ 符号来尝试它:

perl -e '$/ = "\${"; while (<>) { s/\$}\{$/}\n{/; print; }' 但它不起作用。

任何想法都会受到赞赏。

【问题讨论】:

    标签: perl sed ksh aix


    【解决方案1】:

    试一试:

    sed 's/{TNG:}}\$/&\n/' file > newfile
    

    sed 默认使用 BRE,即{}s 是文字字符。但是我们必须避开$

    kent$  cat f
    {TNG:}}${1:F01.
    
    kent$  sed 's/{TNG:}}\$/&\n/' f
    {TNG:}}$
    {1:F01.
    

    【讨论】:

    • 谢谢,但这只是在字符串中添加n,而不是新行。 -}{5:{TNG:}}$n{1:
    • @Mihaimyh 你用的是哪个 sed?它在这里与 gnu sed 一起工作。
    • 我在 AIX 7.2 上使用 sed
    • @Mihaimyh 它不告诉您使用哪个 sed。请报告 sed 版本。还要检查你的 sed 的手册页,你可能需要一些像 -E 这样的选项。
    • 这确实适用于 gnu sed,但在 AIX 上却不行。我将尝试提供sed 版本,但我找不到它。
    【解决方案2】:

    使用 perl:

    $ cat input.txt
    line 1 {TNG:}}${1:F01
    line 2 {TNG:}}${1:F01
    $ perl -pe 's/TNG:\}\}\$\K/\n/' input.txt 
    line 1 {TNG:}}$
    {1:F01
    line 2 {TNG:}}$
    {1:F01
    

    (阅读perlrun 中的-p-n 选项并使用它们,而不是尝试自己做他们在单行中所做的事情)

    【讨论】:

    • @Mihaimyh 不错。我不完全确定你是否有足够新的 perl 来使用 \K 构造。它是很久以前添加的(perl 5.10),但商业 unix 并没有完全保持最新的声誉......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-10
    • 2017-05-09
    • 2013-06-26
    • 2018-12-31
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    相关资源
    最近更新 更多