次のコードは、最初から最後まで入力すると逆方向の出力を提供するため、入力を逆にする必要があります。これをどのように反転/反転できますか?
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
コマンドと出力の順序に注意してください。
( printf 'g?%s?m0\n' 0005 0004 0003 0002 0001 | tac ; printf 'wq\n' ) | ed -s file.txt
これにより、最初のed
によって生成されたprintf
コマンドが逆になります。
tac
での私の提案はうまくいきましたが、おそらくあなたはこれを実際よりもはるかに難しくしていると思います。
file.txt
があり、file.txt
の先頭に行を追加したい場合、たとえばheader_file.txt
に行がある場合は、次のようにするだけです。
cat header_file.txt file.txt > new_playlist.txt
完了しました。
行を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