이 "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

관련 정보