sed / awk将粘贴片段从一个地方复制到同一文件中的其他位置

时间:2015-08-04 21:12:51

标签: regex linux awk sed

如何使用sed/awk工具复制一些代码段并粘贴到同一文件中?

示例:文件名foo.txt包含以下文字我要复制并粘贴到同一文本下面

ABC
DEF
GHI
JKL
MNO
PQR

最终输出就像。

    ABC
    DEF
    GHI
    JKL
    MNO
    PQR

    ABC
    DEF
    GHI
    JKL
    MNO
    PQR

3 个答案:

答案 0 :(得分:6)

OP请求sed,所以这就是!

可能有很多方法可以实现它,但这是我所知道的:

sed 'H;$G' foo.txt
  • H:将当前文件追加到hold buffer
  • ;:将两个表达式分开
  • $:文件结束时
  • G:print hold buffer

但是等等!还有更多!

永远不要忘记 ed是标准文字编辑器(花了一些时间记住如何使用它,我不得不说明了这一点。)< / p>

对于示例,让我们在名为foo.ed的文件中说明(您可以在交互式会话中执行相同操作):

$a

.
,t$
$d
wq

然后将其用于:

ed foo.txt < foo.ed

单行不可读的基础:

ed foo.txt <<< $'$a\n\n.\n,t$\n$d\nwq'

翻译:

  • $a:在文件的末尾插入所有内容(此处只有一个新行),直到单点.
  • ,t$:将整个文件内容复制到最后
  • $d:删除最后一行,因为我不记得如何复制到文件结尾之前的行!@#
  • wq:写并退出

参考文献:

答案 1 :(得分:4)

假设您想要复制整个文件而不想真正缩进输出行,那么您永远不会使用sed或awk,只需要cat和echo:

$ cat file; echo ''; cat file
$ cat file
ABC
DEF
GHI
JKL
MNO
PQR

ABC
DEF
GHI
JKL
MNO
PQR

如果你想修改原始文件,只需将输出重定向到tmp文件,然后将其转换为文件:

(cat file; echo ''; cat file) > tmp && mv tmp file

答案 2 :(得分:1)

Fedorqui在评论中指出,你可以多次在同一个文件上运行Awk。

awk 'NR>1 && FNR==1 {print ""} {print "\t" $0}' foo.txt foo.txt

应该产生你想要的输出。

可以使用bash brace expansion foo.txt{,}简化此操作。

此外,如果使用GNU Awk,还有一个名为ENDFILE的内置规则,允许您在每个文件中处理完最后一条记录后执行操作:

awk '{print "\t" $0} ENDFILE{print ""}' foo.txt{,}

或者,你可能是一头猪并将整个文件读入内存,然后循环两次。

awk '{
    a[NR]=$0
} END {
    num=2
    for (i=1; i<=num; i++) {
        for (j=1; j<=NR; j++)
            print "\t"a[j]
        if (i % num != 0)
            print ""
    }
}' foo.txt

您会注意到每个行号NR也必须记录为数组a的索引,以保留输出中的原始顺序。