What do the dots in this tr command do: tr …A-Z A-ZA-Z <<< “JVPQBOV” (with 13 dots)
.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ margin-bottom:0;
}
I want to use tr
to do some rot13 transformation. I can beautifully understand this command:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
which output is HELP ME PLEASE
, but I can't figure out how this other command can produce the same rot13 transformation:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
So I have two questions:
- What's the magic behind the second
tr
command? - How to make the second command work for both lower and upper case, just like the first command?
tr
New contributor
add a comment |
I want to use tr
to do some rot13 transformation. I can beautifully understand this command:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
which output is HELP ME PLEASE
, but I can't figure out how this other command can produce the same rot13 transformation:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
So I have two questions:
- What's the magic behind the second
tr
command? - How to make the second command work for both lower and upper case, just like the first command?
tr
New contributor
I know there's 13 dots. What I wanna know is how it works. There's no explanation about dots in the manual
– Frederico Oliveira
yesterday
2
you had better hope you don't run into a dot in your input text
– iruvar
yesterday
add a comment |
I want to use tr
to do some rot13 transformation. I can beautifully understand this command:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
which output is HELP ME PLEASE
, but I can't figure out how this other command can produce the same rot13 transformation:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
So I have two questions:
- What's the magic behind the second
tr
command? - How to make the second command work for both lower and upper case, just like the first command?
tr
New contributor
I want to use tr
to do some rot13 transformation. I can beautifully understand this command:
tr A-Za-z N-ZA-Mn-za-m <<< "URYC ZR CYRNFR"
which output is HELP ME PLEASE
, but I can't figure out how this other command can produce the same rot13 transformation:
tr .............A-Z A-ZA-Z <<< "URYC ZR CYRNFR"
So I have two questions:
- What's the magic behind the second
tr
command? - How to make the second command work for both lower and upper case, just like the first command?
tr
tr
New contributor
New contributor
edited yesterday
Michael Homer
50.7k8140177
50.7k8140177
New contributor
asked yesterday
Frederico OliveiraFrederico Oliveira
703
703
New contributor
New contributor
I know there's 13 dots. What I wanna know is how it works. There's no explanation about dots in the manual
– Frederico Oliveira
yesterday
2
you had better hope you don't run into a dot in your input text
– iruvar
yesterday
add a comment |
I know there's 13 dots. What I wanna know is how it works. There's no explanation about dots in the manual
– Frederico Oliveira
yesterday
2
you had better hope you don't run into a dot in your input text
– iruvar
yesterday
I know there's 13 dots. What I wanna know is how it works. There's no explanation about dots in the manual
– Frederico Oliveira
yesterday
I know there's 13 dots. What I wanna know is how it works. There's no explanation about dots in the manual
– Frederico Oliveira
yesterday
2
2
you had better hope you don't run into a dot in your input text
– iruvar
yesterday
you had better hope you don't run into a dot in your input text
– iruvar
yesterday
add a comment |
3 Answers
3
active
oldest
votes
It works as follows:
SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
So tr
will translate SET1
to SET2
.
This is equivalent to first one because it is also shifting by 13
units as there 13 dots.
To include the lower case letters, you'll have to arrange them in SET1
with a similar offset, i.e.:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
That's 26 dots between Z
and a
, spanning half the upper-case and half the lower-case alphabet. So the tr
command itself will be:
tr .............A-Z..........................a-z A-ZA-Za-za-z
add a comment |
As @Prvt_Yadv says in their answer, it works because there are 13 dots.
The sets are
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
The dot isn't a special character, so if you have a dot in your input, it will be translated too. In the version of tr
that I have, it is the last corresponding character in the second set, in this case an M
:
$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM
(I could imagine that a different version of tr
might use the first matching character in set 2, which would give an A
.)
To answer your second question, you need another 13 dots in the first set to "use up" the remaining uppercase letters in set 2:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
then you can repeat the pattern:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
which gives us:
tr .............A-Z..........................a-z A-ZA-Za-za-z
And so:
$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Personally, I think the first way of doing it in your question is simpler!
The first way also doesn't transform any other characters in the input. For example, compare:
$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
with
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
New contributor
add a comment |
Ok, so thanks to @Prvt_Yadv I was able to understand the dots. Here's the first question answer:
What's the magic behind the second
tr
command?
The 13 dots are simply being mapped to the first 13 letters from the second set. So
tr .............A-Z A-ZA-Z
will produce the following sets:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
If your input doesn't contain a dot, you can discard the initial sequence, since you won't use those substitution. Then the sets would become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
But since the first set already contains all 26 letters and set2 has repeating trailing letter, those are discarded too, finally becoming
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Which is the rot13 substitution and identical to the first command (except for not dealing with lower cases here). The same logic can be applied for the title of the question:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
would produce the sets:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Discarding the initial sequence and the trailing repeating letters they become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Which is the rot3 substitution.
Now for the second question:
How to make the second command work for both lower and upper case, just like the first command?
To make it work you put the desired number of dots at the beginning, matching your rot and 26 dots between to upper sequence and the lower sequence, just like this:
tr ........A-Z..........................a-z A-ZA-Za-za-z
This would successfully create an insensitive rot8. To visualize why this works let's see the sets:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Excluding the dots mapping and trailing letters:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Now it works for both upper and lower case :)
Another way to make it works is to use two tr
commands as follow:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
A caveat to using the dots substitution was gave by @iruvar: this command will not work as expected when the input string has dots. This is because the dots are being mapped to other letters and when doing the substitution, tr
will change the input dot to the last mapped letter. But you can actually use any other character than dots. So, if using dots in your tr
command is a problem, you can use @
instead, for example. This would work just as fine:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
New contributor
3
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets andtr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character.
toA
, and alsoB
, and also ..., and alsoM
. This doesn't matter since your input doesn't contain a.
, but if it did it would turn into anM
(tr
uses the last output you specify for a given input)
– Michael Mrozek♦
yesterday
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
1
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "106"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Frederico Oliveira is a new contributor. Be nice, and check out our Code of Conduct.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f510838%2fwhat-do-the-dots-in-this-tr-command-do-tr-a-z-a-za-z-jvpqbov%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
It works as follows:
SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
So tr
will translate SET1
to SET2
.
This is equivalent to first one because it is also shifting by 13
units as there 13 dots.
To include the lower case letters, you'll have to arrange them in SET1
with a similar offset, i.e.:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
That's 26 dots between Z
and a
, spanning half the upper-case and half the lower-case alphabet. So the tr
command itself will be:
tr .............A-Z..........................a-z A-ZA-Za-za-z
add a comment |
It works as follows:
SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
So tr
will translate SET1
to SET2
.
This is equivalent to first one because it is also shifting by 13
units as there 13 dots.
To include the lower case letters, you'll have to arrange them in SET1
with a similar offset, i.e.:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
That's 26 dots between Z
and a
, spanning half the upper-case and half the lower-case alphabet. So the tr
command itself will be:
tr .............A-Z..........................a-z A-ZA-Za-za-z
add a comment |
It works as follows:
SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
So tr
will translate SET1
to SET2
.
This is equivalent to first one because it is also shifting by 13
units as there 13 dots.
To include the lower case letters, you'll have to arrange them in SET1
with a similar offset, i.e.:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
That's 26 dots between Z
and a
, spanning half the upper-case and half the lower-case alphabet. So the tr
command itself will be:
tr .............A-Z..........................a-z A-ZA-Za-za-z
It works as follows:
SET1-> .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
SET2-> ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLM
So tr
will translate SET1
to SET2
.
This is equivalent to first one because it is also shifting by 13
units as there 13 dots.
To include the lower case letters, you'll have to arrange them in SET1
with a similar offset, i.e.:
.............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklm
That's 26 dots between Z
and a
, spanning half the upper-case and half the lower-case alphabet. So the tr
command itself will be:
tr .............A-Z..........................a-z A-ZA-Za-za-z
edited 21 hours ago
ilkkachu
63.2k10103181
63.2k10103181
answered yesterday
Prvt_YadvPrvt_Yadv
3,19631330
3,19631330
add a comment |
add a comment |
As @Prvt_Yadv says in their answer, it works because there are 13 dots.
The sets are
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
The dot isn't a special character, so if you have a dot in your input, it will be translated too. In the version of tr
that I have, it is the last corresponding character in the second set, in this case an M
:
$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM
(I could imagine that a different version of tr
might use the first matching character in set 2, which would give an A
.)
To answer your second question, you need another 13 dots in the first set to "use up" the remaining uppercase letters in set 2:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
then you can repeat the pattern:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
which gives us:
tr .............A-Z..........................a-z A-ZA-Za-za-z
And so:
$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Personally, I think the first way of doing it in your question is simpler!
The first way also doesn't transform any other characters in the input. For example, compare:
$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
with
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
New contributor
add a comment |
As @Prvt_Yadv says in their answer, it works because there are 13 dots.
The sets are
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
The dot isn't a special character, so if you have a dot in your input, it will be translated too. In the version of tr
that I have, it is the last corresponding character in the second set, in this case an M
:
$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM
(I could imagine that a different version of tr
might use the first matching character in set 2, which would give an A
.)
To answer your second question, you need another 13 dots in the first set to "use up" the remaining uppercase letters in set 2:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
then you can repeat the pattern:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
which gives us:
tr .............A-Z..........................a-z A-ZA-Za-za-z
And so:
$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Personally, I think the first way of doing it in your question is simpler!
The first way also doesn't transform any other characters in the input. For example, compare:
$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
with
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
New contributor
add a comment |
As @Prvt_Yadv says in their answer, it works because there are 13 dots.
The sets are
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
The dot isn't a special character, so if you have a dot in your input, it will be translated too. In the version of tr
that I have, it is the last corresponding character in the second set, in this case an M
:
$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM
(I could imagine that a different version of tr
might use the first matching character in set 2, which would give an A
.)
To answer your second question, you need another 13 dots in the first set to "use up" the remaining uppercase letters in set 2:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
then you can repeat the pattern:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
which gives us:
tr .............A-Z..........................a-z A-ZA-Za-za-z
And so:
$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Personally, I think the first way of doing it in your question is simpler!
The first way also doesn't transform any other characters in the input. For example, compare:
$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
with
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
New contributor
As @Prvt_Yadv says in their answer, it works because there are 13 dots.
The sets are
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
The dot isn't a special character, so if you have a dot in your input, it will be translated too. In the version of tr
that I have, it is the last corresponding character in the second set, in this case an M
:
$ echo URYC ZR CYRNFR. | tr .............A-Z A-ZA-Z
HELP ME PLEASEM
(I could imagine that a different version of tr
might use the first matching character in set 2, which would give an A
.)
To answer your second question, you need another 13 dots in the first set to "use up" the remaining uppercase letters in set 2:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ.............
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZ
then you can repeat the pattern:
First set: .............ABCDEFGHIJKLMNOPQRSTUVWXYZ..........................abcdefghijklmnopqrstuvwxyz
Second set: ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
which gives us:
tr .............A-Z..........................a-z A-ZA-Za-za-z
And so:
$ echo Uryc zr cyrnfr | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me please
Personally, I think the first way of doing it in your question is simpler!
The first way also doesn't transform any other characters in the input. For example, compare:
$ echo Uryc zr cyrnfr. | tr .............A-Z..........................a-z A-ZA-Za-za-z
Help me pleasem
with
$ echo Uryc zr cyrnfr. | tr A-Za-z N-ZA-Mn-za-m
Help me please.
New contributor
edited 21 hours ago
New contributor
answered yesterday
user7761803user7761803
1013
1013
New contributor
New contributor
add a comment |
add a comment |
Ok, so thanks to @Prvt_Yadv I was able to understand the dots. Here's the first question answer:
What's the magic behind the second
tr
command?
The 13 dots are simply being mapped to the first 13 letters from the second set. So
tr .............A-Z A-ZA-Z
will produce the following sets:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
If your input doesn't contain a dot, you can discard the initial sequence, since you won't use those substitution. Then the sets would become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
But since the first set already contains all 26 letters and set2 has repeating trailing letter, those are discarded too, finally becoming
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Which is the rot13 substitution and identical to the first command (except for not dealing with lower cases here). The same logic can be applied for the title of the question:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
would produce the sets:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Discarding the initial sequence and the trailing repeating letters they become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Which is the rot3 substitution.
Now for the second question:
How to make the second command work for both lower and upper case, just like the first command?
To make it work you put the desired number of dots at the beginning, matching your rot and 26 dots between to upper sequence and the lower sequence, just like this:
tr ........A-Z..........................a-z A-ZA-Za-za-z
This would successfully create an insensitive rot8. To visualize why this works let's see the sets:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Excluding the dots mapping and trailing letters:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Now it works for both upper and lower case :)
Another way to make it works is to use two tr
commands as follow:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
A caveat to using the dots substitution was gave by @iruvar: this command will not work as expected when the input string has dots. This is because the dots are being mapped to other letters and when doing the substitution, tr
will change the input dot to the last mapped letter. But you can actually use any other character than dots. So, if using dots in your tr
command is a problem, you can use @
instead, for example. This would work just as fine:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
New contributor
3
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets andtr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character.
toA
, and alsoB
, and also ..., and alsoM
. This doesn't matter since your input doesn't contain a.
, but if it did it would turn into anM
(tr
uses the last output you specify for a given input)
– Michael Mrozek♦
yesterday
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
1
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
add a comment |
Ok, so thanks to @Prvt_Yadv I was able to understand the dots. Here's the first question answer:
What's the magic behind the second
tr
command?
The 13 dots are simply being mapped to the first 13 letters from the second set. So
tr .............A-Z A-ZA-Z
will produce the following sets:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
If your input doesn't contain a dot, you can discard the initial sequence, since you won't use those substitution. Then the sets would become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
But since the first set already contains all 26 letters and set2 has repeating trailing letter, those are discarded too, finally becoming
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Which is the rot13 substitution and identical to the first command (except for not dealing with lower cases here). The same logic can be applied for the title of the question:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
would produce the sets:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Discarding the initial sequence and the trailing repeating letters they become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Which is the rot3 substitution.
Now for the second question:
How to make the second command work for both lower and upper case, just like the first command?
To make it work you put the desired number of dots at the beginning, matching your rot and 26 dots between to upper sequence and the lower sequence, just like this:
tr ........A-Z..........................a-z A-ZA-Za-za-z
This would successfully create an insensitive rot8. To visualize why this works let's see the sets:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Excluding the dots mapping and trailing letters:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Now it works for both upper and lower case :)
Another way to make it works is to use two tr
commands as follow:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
A caveat to using the dots substitution was gave by @iruvar: this command will not work as expected when the input string has dots. This is because the dots are being mapped to other letters and when doing the substitution, tr
will change the input dot to the last mapped letter. But you can actually use any other character than dots. So, if using dots in your tr
command is a problem, you can use @
instead, for example. This would work just as fine:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
New contributor
3
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets andtr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character.
toA
, and alsoB
, and also ..., and alsoM
. This doesn't matter since your input doesn't contain a.
, but if it did it would turn into anM
(tr
uses the last output you specify for a given input)
– Michael Mrozek♦
yesterday
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
1
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
add a comment |
Ok, so thanks to @Prvt_Yadv I was able to understand the dots. Here's the first question answer:
What's the magic behind the second
tr
command?
The 13 dots are simply being mapped to the first 13 letters from the second set. So
tr .............A-Z A-ZA-Z
will produce the following sets:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
If your input doesn't contain a dot, you can discard the initial sequence, since you won't use those substitution. Then the sets would become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
But since the first set already contains all 26 letters and set2 has repeating trailing letter, those are discarded too, finally becoming
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Which is the rot13 substitution and identical to the first command (except for not dealing with lower cases here). The same logic can be applied for the title of the question:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
would produce the sets:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Discarding the initial sequence and the trailing repeating letters they become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Which is the rot3 substitution.
Now for the second question:
How to make the second command work for both lower and upper case, just like the first command?
To make it work you put the desired number of dots at the beginning, matching your rot and 26 dots between to upper sequence and the lower sequence, just like this:
tr ........A-Z..........................a-z A-ZA-Za-za-z
This would successfully create an insensitive rot8. To visualize why this works let's see the sets:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Excluding the dots mapping and trailing letters:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Now it works for both upper and lower case :)
Another way to make it works is to use two tr
commands as follow:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
A caveat to using the dots substitution was gave by @iruvar: this command will not work as expected when the input string has dots. This is because the dots are being mapped to other letters and when doing the substitution, tr
will change the input dot to the last mapped letter. But you can actually use any other character than dots. So, if using dots in your tr
command is a problem, you can use @
instead, for example. This would work just as fine:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
New contributor
Ok, so thanks to @Prvt_Yadv I was able to understand the dots. Here's the first question answer:
What's the magic behind the second
tr
command?
The 13 dots are simply being mapped to the first 13 letters from the second set. So
tr .............A-Z A-ZA-Z
will produce the following sets:
SET1 -> .............ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
If your input doesn't contain a dot, you can discard the initial sequence, since you won't use those substitution. Then the sets would become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
But since the first set already contains all 26 letters and set2 has repeating trailing letter, those are discarded too, finally becoming
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> NOPQRSTUVXWYZABCDEFGHIJKLM
Which is the rot13 substitution and identical to the first command (except for not dealing with lower cases here). The same logic can be applied for the title of the question:
tr ...A-Z A-ZA-Z <<< “JVPQBOV”
would produce the sets:
SET1 -> ...ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZ
Discarding the initial sequence and the trailing repeating letters they become:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZ
SET2 -> DEFGHIJKLMNOPQRSTUVXWYZABC
Which is the rot3 substitution.
Now for the second question:
How to make the second command work for both lower and upper case, just like the first command?
To make it work you put the desired number of dots at the beginning, matching your rot and 26 dots between to upper sequence and the lower sequence, just like this:
tr ........A-Z..........................a-z A-ZA-Za-za-z
This would successfully create an insensitive rot8. To visualize why this works let's see the sets:
SET1 -> ........ABCDEFGHIJKLMNOPQRSTUVXWYZ..........................abcdefghijklmnopqrstuvxwyz
SET2 -> ABCDEFGHIJKLMNOPQRSTUVXWYZABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyzabcdefghijklmnopqrstuvxwyz
Excluding the dots mapping and trailing letters:
SET1 -> ABCDEFGHIJKLMNOPQRSTUVXWYZabcdefghijklmnopqrstuvxwyz
SET2 -> IJKLMNOPQRSTUVXWYZABCDEFGHijklmnopqrstuvxwyzabcdefgh
Now it works for both upper and lower case :)
Another way to make it works is to use two tr
commands as follow:
tr .............A-Z A-ZA-Z <<< "ABJ V hqrefgnaq" | tr .............a-z a-za-z
A caveat to using the dots substitution was gave by @iruvar: this command will not work as expected when the input string has dots. This is because the dots are being mapped to other letters and when doing the substitution, tr
will change the input dot to the last mapped letter. But you can actually use any other character than dots. So, if using dots in your tr
command is a problem, you can use @
instead, for example. This would work just as fine:
tr @@@@@@@@@@@@@A-Z A-ZA-Z <<< "GUNAX LBH NYY..."
New contributor
edited 23 hours ago
New contributor
answered yesterday
Frederico OliveiraFrederico Oliveira
703
703
New contributor
New contributor
3
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets andtr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character.
toA
, and alsoB
, and also ..., and alsoM
. This doesn't matter since your input doesn't contain a.
, but if it did it would turn into anM
(tr
uses the last output you specify for a given input)
– Michael Mrozek♦
yesterday
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
1
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
add a comment |
3
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets andtr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character.
toA
, and alsoB
, and also ..., and alsoM
. This doesn't matter since your input doesn't contain a.
, but if it did it would turn into anM
(tr
uses the last output you specify for a given input)
– Michael Mrozek♦
yesterday
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
1
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
3
3
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets and
tr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character .
to A
, and also B
, and also ..., and also M
. This doesn't matter since your input doesn't contain a .
, but if it did it would turn into an M
(tr
uses the last output you specify for a given input)– Michael Mrozek♦
yesterday
I'm not sure how you concluded that "dots are replaced by a sequence of letters starting from a to the number of dots"; that's not at all the case. There's no magic involved; as Prvt_Yadv explained, there are two sets and
tr
is mapping from set 1 to set 2, as always, but in this case you've mapped the character .
to A
, and also B
, and also ..., and also M
. This doesn't matter since your input doesn't contain a .
, but if it did it would turn into an M
(tr
uses the last output you specify for a given input)– Michael Mrozek♦
yesterday
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
23 hours ago
1
1
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
I admire your (initial) attempts to use science to determine the behaviour of this program, but in future you should come up with as many different hypotheses as possible and design tests to distinguish between all of them before trying to use them. Otherwise you end up getting confused, and adapting your model in a least-changes manner to explain subsequent results until your model's just a mass of special-cases.
– wizzwizz4
12 hours ago
add a comment |
Frederico Oliveira is a new contributor. Be nice, and check out our Code of Conduct.
Frederico Oliveira is a new contributor. Be nice, and check out our Code of Conduct.
Frederico Oliveira is a new contributor. Be nice, and check out our Code of Conduct.
Frederico Oliveira is a new contributor. Be nice, and check out our Code of Conduct.
Thanks for contributing an answer to Unix & Linux Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f510838%2fwhat-do-the-dots-in-this-tr-command-do-tr-a-z-a-za-z-jvpqbov%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
I know there's 13 dots. What I wanna know is how it works. There's no explanation about dots in the manual
– Frederico Oliveira
yesterday
2
you had better hope you don't run into a dot in your input text
– iruvar
yesterday