入力順序をどのように変更しますか?

入力順序をどのように変更しますか?

次のコードは、最初から最後まで入力を押すと逆方向の出力を提供するため、入力を逆にする必要があります。どのように反転または反転できますか?

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.txtheader_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つずつ進んでください。

  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
    
  2. 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
    
  3. 最後に、プレースホルダーを削除する必要があります(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

関連情報