web-dev-qa-db-ja.com

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

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

これが私が持っているコードです:

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

(クレジットはsteeldriverに行きます。私がここまで到達するのを手伝ってくれました。本当にこのサイトの素晴らしいユーザーです!)

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

name_003
name_005
name_004
name_002
name_001

または、元の順序で、一番上に配置します。

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

name_001
name_002
name_003
name_004
name_005

printfedに精通している人はいますか?

1
Anonymous

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

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ではなく、ed(実際にはVim)を使用しています。 -cオプションを使用してコマンドラインでexコマンドを指定できるため、printfは必要ありません。
  • パターンは逆の順序である必要があります(005が最初に一番上に移動し、次に004、次に005、次に003、両方の004を押し下げます。および005、...)

printfedの場合、多分:

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