rev - reverse lines characterwise

문자열 출력의 순서를 반대로 한다. 한 글자 한 글자 모두 반대로 돌리므로, tac과는 동작 방식이 약간 다르다. 예를 들어 다음과 같은 동작을 한다.

$ cat ttt.go
package main

import (
	"fmt"
	"os"
)

func main() {
	f, err := os.OpenFile("/dev/usb/lp0", os.O_RDWR, 0755)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(-1)
	}
	defer f.Close()

	f.Write([]byte("asdf"))

	os.Exit(0)

}
$ rev ttt.go
niam egakcap

( tropmi
"tmf"	
"so"	
)

{ )(niam cnuf
)5570 ,RWDR_O.so ,"0pl/bsu/ved/"(eliFnepO.so =: rre ,f	
{ lin =! rre fi	
))(rorrE.rre(nltnirP.tmf		
)1-(tixE.so		
}	
)(esolC.f refed	

))"fdsa"(etyb][(etirW.f	

)0(tixE.so	

}

$ echo "asdf    asdf    " | rev
    fdsa    fdsa

문자열의 모든 문자를 뒤집기 때문에 라인 전체가 뒤집하는 것이 아니다. 그 문자열의 문자만 뒤집는다.

만약 완전히(문자열, 그리고 문자) 순서를 뒤집어야 한다면 다음과 같이 사용할 수 있겠다.

$ tac ttt.go | rev | rev | tac
}

)0(tixE.so	

))"fdsa"(etyb][(etirW.f	

)(esolC.f refed	
}	
)1-(tixE.so		
))(rorrE.rre(nltnirP.tmf		
{ lin =! rre fi	
)5570 ,RWDR_O.so ,"0pl/bsu/ved/"(eliFnepO.so =: rre ,f	
{ )(niam cnuf

)
"so"	
"tmf"	
( tropmi

niam egakcap

당연히 제대로 뒤집혔다면, 다시 뒤집었을 때 원래대로 돌아올 것이다.

$ tac ttt.go | rev | rev | tac
package main

import (
	"fmt"
	"os"
)

func main() {
	f, err := os.OpenFile("/dev/usb/lp0", os.O_RDWR, 0755)
	if err != nil {
		fmt.Println(err.Error())
		os.Exit(-1)
	}
	defer f.Close()

	f.Write([]byte("asdf"))

	os.Exit(0)

}