たとえば、次のコードは次のことができます。
[anony@mous-pc ~]$ (printf 'g?%s?m0\n' 008 006 004 002 ; printf 'wq\n') | ed -s file.txt
...内のすべての数字を選択してください...
[anony@mous-pc ~]$ cat file.txt
005
003
110
069
002
008
004
245
009
007
006
...希望の数字(または他の文字列)を一番上に移動します。しかし逆にコードが実行されました...
[anony@mous-pc ~]$ cat file.txt
002
004
006
008
005
003
110
069
245
009
007
...逆順を指定する限り、順序は最初から最後まで(逆順)になります。または…他の人はこれを上から下の形式と呼ぶことができます。もう一度、最初から最後まで実装します。このように最後のコマンドを実行する必要があります...
[anony@mous-pc ~]$ (printf 'g?%s?m0\n' 008 006 004 002 ; printf 'wq\n') | ed -s file.txt
しかし、最初から最後まで数字(または文字列)を入力して最初から最後まで順序を維持するにはどうすればよいですか?
入力結果を変更できない場合は、
sed
出力結果を変更して保存する前に反転または反転できますかfile.txt
?
ベストアンサー1
$ perl -lne '
/00[2468]$/ ? $h{$_} : $A[@A] = $_; }{
print for @h{qw/008 006 004 002/}, @A;
' file.txt
一致する行と一致しない行を別のコンテナに保存します。印刷するときは、ハッシュ%h型の匿名配列から順序を抽出してください。
説明する:
- 各行を読み、一致する行、つまり2、4、6、または8で終わる行が含まれていることを確認します。
%h
一致する行全体がキーになるようにハッシュに保存します$h{$_}
。 - OTW、一致するものがない場合は、一致しない行を配列の後ろにプッシュします
@A
。 - ファイルの終わりを見た後、
%h
まずハッシュ値を印刷します。ご存知のように、ハッシュ値へのアクセスは本質的にランダムです。しかし、これがあなたのニーズの一つであるので、私たちは命令を出すべきです。そのため、表示したい順番でキーを一覧表示して順番を付けます。qw/008 006 004 002/
これは匿名配列です。$h{008}
これで印刷されます$h{006}
。 - 次に、
array @A
一致しない行を含むコンテンツを印刷します。量子電気力学 - 配列を印刷する順序を変更すると、一致する要素が北ではなく南に移動する
@A
のがhash slice @h{...}
わかります。 - このコードはstdoutでのみ印刷されるため、元のコンテンツに戻す必要があります。
perl '...' file.txt > /tmp/file.txt; mv /tmp/file.txt file.txt