この「printf」コードを修正して操作を元に戻すにはどうすればよいですか?

この「printf」コードを修正して操作を元に戻すにはどうすればよいですか?

たとえば、次のコードは次のことができます。

[anony@mous-pc ~]$ (printf 'g?%s?m0\n' 008 006 004 002 ; printf 'wq\n') | ed -s file.txt

...内のすべての数字を選択してください...

[anony@mous-pc ~]$ cat some.txt
005
003
110
069
002
008
004
245
009
007
006

...次のように、実行コードで指定された正確な順序で目的の数字(または他の文字列)を一番上に移動します。

[anony@mous-pc ~]$ cat some.txt
002
004
006
008
005
003
110
069
245
009
007

数値が.txtの上部ではなく下部に揃うようにこのコードをどのように変更できますか?

答え1

0スクリプトedをに変更します$$編集バッファの最後の行を指定します。

$ { printf 'g?%s?m$\n' 008 006 004 002; echo 'wq'; } | ed -s file.txt
$ cat file.txt
005
003
110
069
245
009
007
008
006
004
002

逆順(質問の順序)として適用するには、パターンリストを逆順に置き換える必要があります。

$ { printf 'g?%s?m$\n' 002 004 006 008; echo 'wq'; } | ed -s file.txt
$ cat file.txt
005
003
110
069
245
009
007
002
004
006
008

またはその問題に関しては

{ printf 'g?%s?m$\n' 008 006 004 002 | tac; echo 'wq'; } | ed -s file.txt

tac... GNU coreutilsがインストールされている場合。一部のシステム(BSD)tail -rではtac

答え2

ラインを南に移動するのか、それともそのままにするのかによって、別々の容器に保管してください。その後、すべての行がこのように表示されたら、希望の順序で印刷します。

$ perl -ne 'push @{/_00[2468]$/ ? \@A : \@B}, $_}{print @B, @A' input.txt

posix sedを使用してこれを行うこともできます。

$ sed -ne '
    /_00[2468]$/s//&/w data2468
    //!p
    $r data2468
' input.txt

関連情報