tr은 한 단어를 다른 단어로 어떻게 번역합니까?


9

파일이 있는데 ma.txt출력이 포함되어 있습니다 ls -l. tr명령 ( tr "nik-pc" "root")을 실행하면 이 출력이 나타납니다.

nik-pc@nik:~$ cat ma.txt 
total 52
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 11:33 Desktop
lrwxrwxrwx 1 nik-pc nik-pc    2 Mar  8 22:54 di -> hd
drwxr-xr-x 3 nik-pc nik-pc 4096 Mar 13 13:28 Documents
drwxr-xr-x 7 nik-pc nik-pc 4096 Mar 14 18:21 Downloads
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 09:39 dwhelper
-rw-r--r-- 1 nik-pc nik-pc 2134 Mar 13 17:40 hd
-rw-r--r-- 1 nik-pc nik-pc    3 Mar 13 15:34 m
-rw-r--r-- 1 nik-pc nik-pc    0 Mar 17 19:48 ma.txt
drwxr-xr-x 3 nik-pc nik-pc 4096 Mar 13 14:58 Music
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 12:30 Pictures
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 11:44 Public
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 13 15:58 sd
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 11:44 Templates
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar  5 11:44 Videos
drwxr-xr-x 2 nik-pc nik-pc 4096 Mar 11 11:33 xdm-helper

nik-pc@nik:~$ tr "nik-pc" "root" < ma.txt 
tttat 52
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 11:33 Desottt
trwxrwxrwx 1 too-tt too-tt    2 Mar  8 22:54 do -> hd
drwxr-xr-x 3 too-tt too-tt 4096 Mar 13 13:28 Dttutetts
drwxr-xr-x 7 too-tt too-tt 4096 Mar 14 18:21 Dtwtttads
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 09:39 dwhetter
-rw-r--r-- 1 too-tt too-tt 2134 Mar 13 17:40 hd
-rw-r--r-- 1 too-tt too-tt    3 Mar 13 15:34 t
-rw-r--r-- 1 too-tt too-tt    0 Mar 17 19:48 ta.txt
drwxr-xr-x 3 too-tt too-tt 4096 Mar 13 14:58 Musot
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 12:30 Pottures
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 11:44 Pubtot
drwxr-xr-x 2 too-tt too-tt 4096 Mar 13 15:58 sd
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 11:44 Tetttates
drwxr-xr-x 2 too-tt too-tt 4096 Mar  5 11:44 Vodets
drwxr-xr-x 2 too-tt too-tt 4096 Mar 11 11:33 xdt-hetter

첫 번째 줄에서 "nik"를 "too"로 바꾸었고 "Desktop"의 철자가 "Desottt"가되었습니다.

왜 이런거야? 그 뒤에 논리는 무엇입니까?


3
info coreutils 'tr invocation'무엇을 자세히 설명합니다 tr.
Nephente

4
그건 그렇고 당신은 무엇을하려고합니까? 명령은 당신이 말한대로 정확하게 수행했지만 실제로 당신이 대체 nik-pc하고 root싶습니까?
kos

3
첫 번째 단계는 항상 명령의 매뉴얼 페이지를 확인하는 것입니다.
Mostafa Ahangarha 2016 년

1
@DavidZ : 주 n에도 k-p범위. 첫 번째 세트에서 문자가 두 번 이상 나타나는 결과는 POSIX에 의해 지정되지 않습니다.
hmakholm

1
나는 당신이 정말로 필요로하는 것은 sed명령입니다 ... ls -l | sed 's/nik-pc/root/'당신이 원하는 것을 할 것입니다. tr단일 문자를 변환하는 데 사용됩니다 (예 : 소문자에서 대문자로, 또는 dos 스타일의 행 시프트 (\ r)를 Unix 스타일로 (\ n) 또는 모든 백 슬래시 (Windows)를 슬래시로 바꾸는 것과 같은 것입니다. 예를 들어 "원치 않는"문자를 삭제할 수도 있습니다. 모든 숫자 또는 모든 대문자.
Baard Kopperud 2016 년

답변:


16

tr문자열을 문자 단위로 번역합니다. 첫 번째 세트에서 문자를 검색하여 두 번째 세트의 문자로 바꿉니다.

당신은 nik-pc처음으로 설정했습니다. "k"에서 "p"범위의 모든 문자로 그 부분을 tr확장 k-p하므로 세트는 같습니다 niklmnopc.

두 번째 세트는 root입니다.

무엇 tr지금하는 일은 (평가) 첫 세트에서 첫 번째 문자의 모든 항목을 검색하고 두 번째 세트의 첫 번째 문자로 대체하는 것입니다. 세트 2에 더 이상 문자가 없으면 마지막 문자 만 반복합니다. 아래 표를 참조하십시오 :

n --> r
i --> o
k --> o
l --> t
m --> t
n --> t
o --> t
p --> t
c --> t

이제 왜 "데스크탑"이 "Desottt"가되는지 분명합니다. 이 동작은 완전히 정확하며 의도 된 것입니다.


원하는 것을 대신 사용하여 얻을 수 있습니다 sed.

sed 's/nik-pc/root/g' ma.txt

구문은 다음과 같습니다.

sed 's/SEARCH_PATTERN/REPLACE_STRING/FLAGS' INPUT_FILE

"nik-pc"패턴을 검색하고 전체 일치 항목을 "root"로 바꿉니다. 전역 교체를 가능하게하려면 "g"플래그를 추가해야합니다. 그렇지 않으면 한 줄당 첫 번째 일치 항목 만 바꿉니다.


화살표가있는 표는 설명을 더 명확하게합니다. + 1-ed. 사용자는 아마도 다음과 비슷한 것을 만들 수 있습니다 :printf "A\nB\nC\n" | tr 'ABC' '12'
Sergiy Kolodyazhnyy

18

tr완전한 단어가 아닌 문자를 번역하기위한 것입니다. 세트를 번역 할 수 있습니다. 귀하의 예에서 첫 번째 콜렉션 문자로 "nik-pc"가 있고 "root"는 또 다른 문자입니다. 실제로 k-p는 범위이므로 k에서 p까지의 모든 문자를 포함합니다. 문자를 하나씩 일치 시키므로 n은 r, i에서 o, k에서 o로 변환되며 4 번째 문자 이외의 것은 t가됩니다. 그래서 당신은 "Desktop"을 "Desottt"로 번역했습니다.

이 예제에서 더 명확하게 볼 수 있습니다.

$ echo "ABCDEF" | tr "ABCDEF"  "12"                            
122222

여기에서 tr 세트 1에 위치 4에 D가 있음을 알 수 있습니다 . 그러나 세트 2에 위치 4가 없으므로 마지막 위치 2를 사용하여 변환해야합니다.

당신이하고있는 일은 한 단어를 다른 단어로 번역하는 것입니다. 당신이하고 싶은 것은 sed또는 과 같은 고급 도구를 사용하는 것입니다 awk.

예를 들어

$ ls -l /etc/passwd | awk '{gsub(/root/,"TEST");print}'        
-rw-r--r-- 1 TEST TEST 2575 Feb 29 12:30 /etc/passwd

6
또는 sed s / nik-pc / root / g ma.txt> ma2.txt
Bruni

1
당신은 나보다 훨씬 빠르다 @Serg ... : P
바이트 사령관

2
@ByteCommander 속도가 빠졌지 만 귀하의 답변은 품질면에서 우수하다고 생각합니다.
Sergiy Kolodyazhnyy 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.