【问题标题】:How to append some command output at the end of each line in a Vi file?如何在 Vi 文件的每一行末尾附加一些命令输出?
【发布时间】:2014-03-04 16:09:43
【问题描述】:

假设我有一个 vi 文件如下:

猫文件1

abc 123 pqr
lmn 234 rst
jkl 100 mon

我想获取每行的第二个字段(即,在本例中为 123、234 和 100)并将其附加到同一行的末尾。 我该怎么做?

输出应如下所示:

abc 123 pqr 123
lmn 234 rst 234
jkl 100 mon 100

【问题讨论】:

    标签: shell unix vim awk vi


    【解决方案1】:

    awk:

    $ awk '{NF=NF+1; $NF=$2}1' file
    abc 123 pqr 123
    lmn 234 rst 234
    jkl 100 mon 100
    

    它增加一个字段的数量并将最后一个设置为第二个。那么1 是一个真条件,它被评估为默认的 awk 行为:{print $0}

    也可以

    awk '{print $0, $2}' file
    

    它打印整行加上第二个字​​段。

    甚至更短,thanks Håkon Hægland!:

    awk '{$(NF+1)=$2}1' file
    

    【讨论】:

    • 我试过这个:awk '{NF=NF+1; $NF=$3}1' bteq_files > bteq_files。但是文件被清空了。这是为什么?在没有重定向的情况下,我在提示符下得到了正确的输出。
    • 您不能从文件中读取并重定向到同一个文件。相反,使用临时文件,然后将其移至原始文件:awk '{NF=NF+1; $NF=$2}1' file > temp_file && mv temp_file file
    • 不错的答案。此外,如果 OP 想要在运行 vi 时执行此操作,可以键入 :%!awk '{ print $0, $2 }' 后跟 enter 键,这将通过该 awk 命令过滤整个缓冲区。
    • @fedorqui,见:help filter
    • @fedorqui 我同意,awk 是在这里使用的最佳工具。我提到了cutpaste,因为有评论询问使用cut
    【解决方案2】:

    在 Vi(m) 中有很多方法可以做到这一点。这是我想到的最简单的:

    :%norm 0f<space>yaw$p
    

    解释:

    • :{range}norm command{range} 的每一行上执行普通模式command
    • % 是一个快捷范围,意思是“缓冲区中的所有行”,因此我们将在缓冲区中的每一行上执行以下内容
    • 0 将光标放在当前行的第一列(不是绝对必要,但很好的做法)
    • f&lt;space&gt; 将光标跳转到当前行光标后的第一个 &lt;space&gt;
    • yaw 拉出单词和光标下的&lt;space&gt;
    • $ 跳到行尾
    • p 粘贴之前提取的文本

    【讨论】:

    • 你能分解一下这个命令并解释它在做什么吗?
    • @romanil:非常整洁!还有一个问题:如果我想让光标跳到当前光标位置之后的第二个空格怎么办?我用什么代替 0f?
    • 2f&lt;pace&gt; 是一种方法,但我不喜欢计算字符和单词,f&lt;space&gt;; 更笨也更容易。
    【解决方案3】:

    用mark提示,在vi中就可以了

    :%s/\( [^ ]*\)\(.*\)/\1\2\1/
    

    另一种方式,使用 sed

    sed -r 's/( [^ ]*)(.*)/\1\2\1/' file
    

    【讨论】:

    • 问题不是针对vi的吗?
    • 感谢您确定使用哪个正则表达式。这导致 OP 可以在 vim 中完全做到这一点:输入 :%s/\( [^ ]*\)\(.*\)/\1\2\1/
    • @LordT,是你投反对票的原因吗?我已经更新了 vi 解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-13
    • 2010-09-23
    • 2019-11-09
    • 2014-02-24
    • 1970-01-01
    • 2019-06-23
    • 2013-06-24
    相关资源
    最近更新 更多