-1

オプションの実行順序について混乱していtrます。

たとえば、次のようなコマンドがあります。

echo 123 | tr -ct '\n' '0'

これはどのように実行されますか? -c最初に実行される-tか?

また、このコマンドの結果についても混乱しています。-cが最初に実行され、結果が123で、次に-t実行され、結果が023で、最終が であると思い023\nました。しかし、それは間違っています。正解は123\nです。理由がわかりません。誰か教えていただけますか。

4

2 に答える 2

0

面白いことにtr -ct、最初のセットを補完し、それを 2 番目のセットの長さに切り詰めているように見えます。「最初にSET1をSET2の長さに切り詰める」と述べているため、これはおそらく信頼すべき動作ではありません。-t

とにかく、明らかな効果は-c最初に適用され、最初\nのセットをすべての文字を含むセットに変換しますが\n、昇順でソートされます (したがって、最初の文字は NUL 文字です\0)。次に、-tが適用され、セットが だけに切り詰められ\0ます。そのため、trNUL 文字を文字に変換し0ます。

例として、これを考えてみましょう:

$ tr --version
tr (GNU coreutils) 8.13
$ echo -e 'X\0X'
XX
$ echo -e 'X\0X' | tr -ct '\n' '0'
X0X
于 2013-08-24T13:28:19.557 に答える
0

-c は、string1 内の文字の補数を使用すること、または「string1 にない任意の文字が string1 の値を置き換える」ことを意味します。

-t は、最初の値のセットを 2 番目のセットの長さに切り詰めることを意味します。String2 の長さは 1 文字のみであるため、string1 はその長さに切り捨てられます。

つまり: tr -ct '\n' '0' -> tr -t '\000\001\002...01234...ABCDEF...' '0' -> tr '\000' '0 '

これを試してテストしてください:

printf '\000afoo\n' | tr -ct '\na' '7'

「'\n' または 'a' 以外の任意の文字」 (-c) は '\000' (-t) になります。これは、長さが 1 の string2 に '7' が指定されているためです。

printf '\000afoo\n' | tr -ct '\na' '[7*]'

「'\n' または 'a' 以外の任意の文字」 (-c) は、そのセット内の任意の文字に '7' が使用されるため、残ります。これは GNU および歴史的な BSD tr のデフォルトの動作であるため、-t が指定されていない場合、'7' は '[7*]' と同様に機能します。System V および POSIX tr の場合、'[7*]' は反復形式ですが、'7' は最初のセットの最初の文字を単に '7' に置き換えます。これは間違いなくより直感的であり、確かに問題が発生する場所の一部です。 from (-t が指定されている場合、GNU tr は動作を System V に変更します)。

于 2013-08-24T14:25:48.803 に答える