コードが実行される順序で特定のテキストを含む行をファイルの先頭に移動するにはどうすればよいですか?

コードが実行される順序で特定のテキストを含む行をファイルの先頭に移動するにはどうすればよいですか?

コードが実行される順序で特定のテキストを含む行をファイルの先頭に移動するにはどうすればよいですか?

これは私のコードです。

printf 'g?_001\|_002\|_003\|_004\|_005?m0\nwq\n' | ed -s target_file

(クレジットは次のとおりです。スチールドライバーこの時点まで行くのを手伝ってください。このサイトの本当に素晴らしいユーザーです! )

これにより、次のように一番上に移動します。

name_003
name_005
name_004
name_002
name_001

または、元の順序に関係なく、一番上に移動してください。

printfただし、inとedと同じ順序で配置する必要があるため、codeこの場合は次のようになります。

name_001
name_002
name_003
name_004
name_005

誰もとについてよく知ってprintfいますかed

答え1

別の移動コマンドを使用します。

ex -sc 'g?_005?m0' -c 'g?_004?m0' -c 'g?_003?m0' -c 'g?_002?m0' -c 'g?_001?m0' -c wq target_file

気づく:

  • 代わりに、私はexここ(実際にはVim)を使っていますed。 optionsを使用してコマンドラインでexコマンドを指定することができるので、-cそれはprintf必要ありません。
  • パターンは逆順でなければなりません(005最初に上に移動し、次に下に004スライドし005、次に、下に003押して、...)。004005

printfとを使用すると、edおそらく次のようになります。

(printf 'g?%s?m0\n' {005..001}; printf 'wq\n') |
  ed -s target_file

関連情報