以下代码在按从第一个到最后一个输入时提供向后输出,因此要求输入相反。这如何翻转/逆转?
编辑于 2019-05-23_07:52:04
(printf 'g?%s?m0\n' 0005 0004 0003 0002 0001 ; printf 'wq\n') | ed -s file.txt
不过,我想做的是:
(printf 'g?%s?m0\n' 0001 0002 0003 0004 0005 ; printf 'wq\n') | ed -s file.txt
并在顶部获取输出顺序,file.txt
如下所示:
0001
0002
0003
0004
0005
file.txt
是一个播放列表ffmpeg
,上面的零填充数字是一些选定的视频文件名。播放列表中已有一堆文件名/视频,我想在编译之前将其中一些移至顶部。但是,printf
如果需要从头到尾排序,则不需要像命令所要求的那样以相反的顺序输入它们。
更新于 2019-05-23_07:54:27
$ cat file.txt
5575
3585
0004
7774
0003
5385
0001
8658
0002
0005
$ (printf 'g?%s?m0\n' 0001 0002 0003 0004 0005 ; printf 'wq\n') | ed -s file.txt
$ cat file.txt
0005
0004
0003
0002
0001
9374
4845
4834
4883
5848
记下最后一个cat
命令和输出的顺序。
答案1
尽管我的建议tac
有效,但我认为也许你让这件事变得更加困难。
如果您有file.txt
, 并且您只想在 的开头添加一些行file.txt
,例如 a 中的行header_file.txt
,您可以简单地执行以下操作:
cat header_file.txt file.txt > new_playlist.txt
并做了。
答案2
( printf 'g?%s?m0\n' 0005 0004 0003 0002 0001 | tac ; printf 'wq\n' ) | ed -s file.txt
这会反转ed
第一个生成的命令printf
。
答案3
您可以将行一行一行移至底部(保留所需的顺序),然后将它们作为一组移至顶部,而不是逐行移至顶部。一次一步地进行:
插入占位符行(其内容可以是任何内容 - 最简单的是空行),然后将选定的行移动到文件末尾
m$
。 (注意:我将g?...?
反向搜索更改为更传统的g/.../
- 实际上您搜索的方向并不重要。)$ { printf '$a\n\n.\n'; printf 'g/%s/m$\n' 0001 0002 0003 0004 0005; printf ',p\nq\n'; } | ed -s file.txt 5575 3585 7774 5385 8658 0001 0002 0003 0004 0005
现在在占位符行上添加一个标记 (
kx
),以便我们可以使用以下命令将行寻址x
到$
并将它们移动到顶部'x,$m0
:$ { printf '$a\n\n.\nkx\n'; printf 'g/%s/m$\n' 0001 0002 0003 0004 0005; printf \''x,$m0\n,p\nq\n'; } | ed -s file.txt 0001 0002 0003 0004 0005 5575 3585 7774 5385 8658
最后我们需要删除占位符(现在是第 1 行):
$ { printf '$a\n\n.\nkx\n'; printf 'g/%s/m$\n' 0001 0002 0003 0004 0005; printf \''x,$m0\n1d\n,p\nq\n'; } | ed -s file.txt 0001 0002 0003 0004 0005 5575 3585 7774 5385 8658
将它们放在一起并替换,p
为wq
以进行就地编辑:
$ cat file.txt
5575
3585
0004
7774
0003
5385
0001
8658
0002
0005
$
$ { printf '$a\n\n.\nkx\n'; printf 'g/%s/m$\n' 0001 0002 0003 0004 0005; printf \''x,$m0\n1d\n,wq\n'; } | ed -s file.txt
$
$ cat file.txt
0001
0002
0003
0004
0005
5575
3585
7774
5385
8658