次のコードは、最初から最後まで入力を押すと逆方向の出力を提供するため、入力を逆にする必要があります。どのように反転または反転できますか?
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
おそらくあなたはそれをもっと難しくしていると思います。
があり、始めにいくつかの行(たとえば、aの行)をfile.txt
追加したい場合は、単に次のようにします。file.txt
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
行を一番下に1つずつ移動した後(希望の順序を維持)、行ごとに一番上の行に移動するのではなく、グループに一番上に移動できます。一度に1つずつ進んでください。
プレースホルダ行を挿入し(内容は何でも可能です。最も簡単なのは空白行です)、選択した行をファイルの末尾に移動します
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