如何修改这个“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

相关内容