如何将第一行移动到文件末尾?

如何将第一行移动到文件末尾?

如何删除包含模式的第一行之后的行invHn3ion?,然后将第一行移动到文件末尾?

我在哪里可以学到所有这些表达方式?

答案1

一些比这更快/更简单的击键可能,但使用我有限的vi技能:

  • 转移到 invHn3ion?

    /invHn3ion?
    
  • 向下移动一行

    j
    
  • 删除该行

    dd
    
  • 移至第一行

    1G
    
  • 删除该行

    dd
    
  • 移至文件末尾

    G
    
  • 粘贴

    p
    
  • 节省

    ZZ
    

答案2

让我们从更简单的事情开始。在 vi 编辑器中,要将第一行移动到末尾,请使用命令ex( mmove):

:1m$

参数1是源范围:只是第一行。您可以使用范围2,15m$或模式匹配/a.*bc/m$。目标$表示文件的最后一行。该m命令放置移动的材料目标位置。

没有第 0 行,但目标 0 指定文件的顶部。因此,要将线移回原来的位置:

:$m0

即移动最后一行虚构的第 0 行(因此位于第 1 行之前)。

好的,那么移动与模式匹配的第一行怎么样invHn3ion?首先,我们考虑当前位置可能在任何地方。我们希望从第一行开始搜索,而不是从当前位置开始,因此:

:1/invHn3ion/m$

这里发生的事情实际上是m对地址参数进行操作/invHn3ion/。这1是一个多余的地址,将被评估并丢弃1。我们可以使用两个单独的命令获得相同的效果:

:1
:/invHn3ion/m$

m命令有一个兄弟t(传输),它复制而不是移动。


  1. 在 Ex 中寻址POSIX 标准中的部分,以“命令采用零、一个或两个地址...”段落开始。

答案3

要将第一行移至最后一行,您sed也可以尝试

例如

$ sed -n '1p' file >> file && sed -i '1d' file

编辑:

$ sed -i '1h;1d;$G' file

是一个替代的 GNU sed 脚本。请注意,“-i”选项在计划 9 上不可用。

答案4

对于 sed,命令是:

sed '/invHn3ion?/{h;d}; ${g}' FILE

而且据我所知,sed 语法与 vi 语法非常相似。

将其读为/PATTERN/,如果找到PATTERN,则执行命令h:=复制模式以保留空间,d:=删除该行。 $,如果不是正则表达式的一部分,则表示文件的最后一行。因此,在最后一行中,g:=获取保留空间的内容(并打印它,以前保存的模式)。

关于 sed/awk/perl 正则表达式的教程应该会教你这些。还有 vi/vim 的 YT 视频和书籍。

相关内容