例如,下面的代码可以...
[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