What do the dots in this tr command do: tr …A-Z A-ZA-Z <<< “JVPQBOV” (with 13 dots) Unicorn Meta Zoo #1: Why another podcast? Announcing the arrival of Valued Associate #679: Cesar Manara 2019 Community Moderator Election Results Why I closed the “Why is Kali so hard” questionwhat is the benefit of --squeeze-repeats in tr commandWhy can't tr read from /dev/urandom on OSX?broken pipe error with popen and JS ffiIs the historical Unix V5 tr command padding behavior of set2 different from what we consider today “classic” System V (1983-1988) behavior?Heirloom Toolchest tr: error(s) trying to delete the complement of a set containing a multibyte character?how to substitute minus sign with trPulling IP address from ping command with sed?Why does tr -sc 'A-Za-z' '[12*]' includes empty line?I cannot understand what -c parameter does in tr command in Ubuntu GNU/Linux even though I read the manualStrange behaviour of tr using ranges
What is the best way to deal with NPC-NPC combat?
Could moose/elk survive in the Amazon forest?
Protagonist's race is hidden - should I reveal it?
What does a straight horizontal line above a few notes, after a changed tempo mean?
How to find the stem of any word?
A Paper Record is What I Hamper
How do I check if a string is entirely made of the same substring?
Scheduling based problem
Does Mathematica have an implementation of the Poisson binomial distribution?
What *exactly* is electrical current, voltage, and resistance?
What to do with someone that cheated their way through university and a PhD program?
How much cash can I safely carry into the USA and avoid civil forfeiture?
"Rubric" as meaning "signature" or "personal mark" -- is this accepted usage?
Raising a bilingual kid. When should we introduce the majority language?
What is purpose of DB Browser(dbbrowser.aspx) under admin tool?
Mistake in years of experience in resume?
Is Diceware more secure than a long passphrase?
How can I close the quickfix window and go back to the file I was editing
Multiple options vs single option UI
Why doesn't the standard consider a template constructor as a copy constructor?
Is it possible to cast 2x Final Payment while sacrificing just one creature?
Has a Nobel Peace laureate ever been accused of war crimes?
All ASCII characters with a given bit count
How do I reattach a shelf to the wall when it ripped out of the wall?
What do the dots in this tr command do: tr …A-Z A-ZA-Z
Unicorn Meta Zoo #1: Why another podcast?
Announcing the arrival of Valued Associate #679: Cesar Manara
2019 Community Moderator Election Results
Why I closed the “Why is Kali so hard” questionwhat is the benefit of --squeeze-repeats in tr commandWhy can't tr read from /dev/urandom on OSX?broken pipe error with popen and JS ffiIs the historical Unix V5 tr command padding behavior of set2 different from what we consider today “classic” System V (1983-1988) behavior?Heirloom Toolchest tr: error(s) trying to delete the complement of a set containing a multibyte character?how to substitute minus sign with trPulling IP address from ping command with sed?Why does tr -sc 'A-Za-z' '[12*]' includes empty line?I cannot understand what -c parameter does in tr command in Ubuntu GNU/Linux even though I read the manualStrange behaviour of tr using ranges
.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
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
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
Apr 6 at 3:19
4
you had better hope you don't run into a dot in your input text
– iruvar
Apr 6 at 3:43
1
FWIW the shorter formtr [.*13].A-Z A-ZA-Z
works just as well astr .............A-Z A-ZA-Z
– iruvar
Apr 7 at 14:12
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
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
edited Apr 6 at 3:22
Michael Homer
51.5k8142180
51.5k8142180
asked Apr 6 at 3:12
Frederico OliveiraFrederico Oliveira
1176
1176
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
Apr 6 at 3:19
4
you had better hope you don't run into a dot in your input text
– iruvar
Apr 6 at 3:43
1
FWIW the shorter formtr [.*13].A-Z A-ZA-Z
works just as well astr .............A-Z A-ZA-Z
– iruvar
Apr 7 at 14:12
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
Apr 6 at 3:19
4
you had better hope you don't run into a dot in your input text
– iruvar
Apr 6 at 3:43
1
FWIW the shorter formtr [.*13].A-Z A-ZA-Z
works just as well astr .............A-Z A-ZA-Z
– iruvar
Apr 7 at 14:12
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
Apr 6 at 3:19
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
Apr 6 at 3:19
4
4
you had better hope you don't run into a dot in your input text
– iruvar
Apr 6 at 3:43
you had better hope you don't run into a dot in your input text
– iruvar
Apr 6 at 3:43
1
1
FWIW the shorter form
tr [.*13].A-Z A-ZA-Z
works just as well as tr .............A-Z A-ZA-Z
– iruvar
Apr 7 at 14:12
FWIW the shorter form
tr [.*13].A-Z A-ZA-Z
works just as well as tr .............A-Z A-ZA-Z
– iruvar
Apr 7 at 14:12
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.
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..."
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♦
Apr 6 at 6:33
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
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
Apr 6 at 18:46
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
);
);
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 Apr 6 at 9:39
ilkkachu
63.6k10104182
63.6k10104182
answered Apr 6 at 3:27
Prvt_YadvPrvt_Yadv
3,35631531
3,35631531
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.
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.
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.
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.
edited Apr 6 at 10:33
answered Apr 6 at 6:39
user7761803user7761803
1413
1413
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..."
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♦
Apr 6 at 6:33
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
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
Apr 6 at 18:46
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..."
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♦
Apr 6 at 6:33
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
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
Apr 6 at 18:46
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..."
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..."
edited Apr 6 at 7:40
answered Apr 6 at 4:49
Frederico OliveiraFrederico Oliveira
1176
1176
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♦
Apr 6 at 6:33
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
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
Apr 6 at 18:46
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♦
Apr 6 at 6:33
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
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
Apr 6 at 18:46
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♦
Apr 6 at 6:33
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♦
Apr 6 at 6:33
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
Thanks for the clarification. I've updated the answer to fix my mistakes :)
– Frederico Oliveira
Apr 6 at 7:35
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
Apr 6 at 18:46
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
Apr 6 at 18:46
add a comment |
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
Apr 6 at 3:19
4
you had better hope you don't run into a dot in your input text
– iruvar
Apr 6 at 3:43
1
FWIW the shorter form
tr [.*13].A-Z A-ZA-Z
works just as well astr .............A-Z A-ZA-Z
– iruvar
Apr 7 at 14:12