web-dev-qa-db-ja.com

tacを使用してファイルを1文字ずつ反転します

tacを使用して、テキストファイルを1文字ずつ反転させたい。 coreutilsの情報ページで、次のような例を見つけました。#ファイルを1文字ずつ反転するtac -r -s 'x\|[^x]'

ただし、tac -r -sを実行すると、ファイルを印刷する代わりに標準入力が開くようです。 'x\|[^x]'とはどういう意味ですか?どうすればよいですか?

また、tac [file]tac -r [file]の出力は同じであり、cat [file]と同じであることに注意しました。それでも、文字の逆で文字を理解することはできません。

5
Weezy

tacを使用してファイルを文字ごとに反転するには、次を使用します。

tac -r -s 'x\|[^x]'

これはinfo tacに記載されています

# Reverse a file character by character.
tac -r -s 'x\|[^x]'

-rにより、セパレータは正規表現として扱われます-s SEPSEPを区切り文字として使用しますx\|[^x]は、すべての文字(xであるものと、xではないもの)に一致する正規表現です。

$ cat testfile
abc
def
ghi
$ tac -r -s 'x\|[^x]' testfile

ihg
fed
cba%
$

fileに1行しかない場合を除いて、tac filecat fileと同じではありません。 tac -r filetac fileと同じです。これは、デフォルトの区切り文字が\nであるためです。これは、正規表現として扱われる場合と同じでない場合と同じです。

7
Michael Homer

LF文字 (mosvyのコメントを参照)を気にしない場合は、tac -r -s 'x\|[^x]'ではなくrevを使用し、必要に応じてtacにパイプする方がはるかに効率的です。

$ cat testfile
abc
def
ghi
$ rev testfile
cba
fed
ihg
$ rev testfile|tac
ihg
fed
cba

このソリューションは、正規表現によって処理速度が大幅に低下する傾向があるため、tac -r -s 'x\|[^x]'よりもはるかに安価です。