如何删除包含模式的第一行之后的行invHn3ion?
,然后将第一行移动到文件末尾?
我在哪里可以学到所有这些表达方式?
答案1
一些比这更快/更简单的击键可能,但使用我有限的vi
技能:
转移到 invHn3ion?
/invHn3ion?
向下移动一行
j
删除该行
dd
移至第一行
1G
删除该行
dd
移至文件末尾
G
粘贴
p
节省
ZZ
答案2
让我们从更简单的事情开始。在 vi 编辑器中,要将第一行移动到末尾,请使用命令ex
( m
move):
: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
(传输),它复制而不是移动。
- 看在 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 视频和书籍。