web-dev-qa-db-ja.com

入力順序を逆にする方法は?

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

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.txtffmpegの再生リストであり、上記のゼロが埋め込まれた数字は、選択された動画のファイル名です。プレイリストにはすでにたくさんのファイル名/ビデオが含まれているので、コンパイルする前にいくつかを一番上に移動したいと思います。ただし、最初から最後の順序が必要な場合は、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コマンドと出力の順序に注意してください。

2
Anonymous
( printf 'g?%s?m0\n' 0005 0004 0003 0002 0001 | tac ; printf 'wq\n' ) | ed -s file.txt

これにより、最初のedによって生成されたprintfコマンドが逆になります。

3
Kusalananda

tacでの私の提案はうまくいきましたが、おそらくあなたはこれを実際よりもはるかに難しくしていると思います。

file.txtがあり、file.txtの先頭に行を追加したい場合、たとえばheader_file.txtに行がある場合は、次のようにするだけです。

cat header_file.txt file.txt > new_playlist.txt

完了しました。

4
matsib.dev

行を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
    

すべてをまとめて、,pwqに置き換えて、その場で編集します。

$ 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
2
steeldriver