【问题标题】:Sed add line in between two characters on each linesed 在每行的两个字符之间添加行
【发布时间】:2015-07-29 21:58:07
【问题描述】:

我有一个包含以下行的文件:

HETATM XXXX  O   ...
HETATM XXXX  O   ...
HETATM XXXX  O   ...
HETATM XXXX O   ...
HETATM XXXX O   ...
HETATM XXXX O   ...

其中XXXX 是一个 1-5 位数字。 我想在最后三行的XXXXO 之间添加一个空格,以便它们与前三行匹配。我可以用HETATM *[0-9]* O 选择相关部分。如何使用sed[0-9]*O 之间添加一个额外的空格? (注意:我使用的是 Mac OS X)

【问题讨论】:

    标签: regex macos sed


    【解决方案1】:

    我会使用tac 反向打印文件,然后使用awk 在前三行的第二个字段之后包含一个空格,然后将其反向:

    tac file | awk 'NR<=3 {$2=$2" "}1' | tac
    

    测试

    $ cat a
    HETATM XXXX  O   ...
    HETATM XXXX  O   ...
    HETATM XXXX  O   ...
    HETATM XXXX O   ...
    HETATM XXXX O   ...
    HETATM XXXX O   ...
    $ tac a | awk 'NR<=3 {$2=$2" "}1' | tac
    HETATM XXXX  O   ...
    HETATM XXXX  O   ...
    HETATM XXXX  O   ...
    HETATM XXXX  O ...
    HETATM XXXX  O ...
    HETATM XXXX  O ...
    

    【讨论】:

    • 是否可以指定应该在哪一行停止添加字符?它说tac: command not found
    • 是的,当然,只需将3 替换为您想要的号码。或使其可变:tac file | awk -v lines=3 'NR&lt;=lines {$2=$2" "}1' | tac
    • 这会改变它开始的行号吗?我想指定一个范围:例如,在 31200 之间。
    • 然后你可以说NR&gt;=min &amp;&amp; NR&lt;=max 并提供minmax 值。考虑到tac 正在反向打印。但是,如果您确定哪些行会受到影响(即,不是“最后 3 行”而是“从 X 行到 Y 行”),只需去掉 tac 并运行 awk 部分。
    猜你喜欢
    • 2020-07-19
    • 2016-04-02
    • 2021-05-26
    • 2014-03-01
    • 2013-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多