tr 명령의 '-s', '-t'및 '-c'옵션은 Unix에서 어떻게 작동합니까?


12

나는 방법에 대한 혼란 스러워요 -s, -t그리고 -c옵션에서 작동 그럴 명령. 내가 할 때

echo I am a good boy | tr good bad

나는 출력을 얻는다 :

I am a bddd bdy

o에서 반복 되기 때문에 이것은 매우 이해할 수 good있습니다. 대신에, 최후의 가능한 변화 oIS d, 따라서 출력.

이제 내가 할 때

echo I am a good boy | tr -s good bad

출력은

I am a bd bdy

-s옵션으로 하나의 선두로부터 1 세트의 각 문자마다 반복 선두로부터 짜내 후 동일한 위치에 세트 2에 대응하는 문자 세트에 하나의 각 문자를 변경할 예정이다.

그래서 그것은

I am a bad bay.

왜 변화?

또한 내가 할 때

echo I am a good boy | tr -c good bad

나는 얻다 dddddddgoodddodd

이 예제를 참조 하여 -c옵션이 어떻게 작동 tr합니까?

그리고 마지막으로 : 좋은 소년에서 나쁜 소년으로 나 자신을 바꾸는 방법 .... :) : P 즉,

echo I am a good boy | tr <something>나에게 출력을 제공합니다 : I am a bad boy.

답변:


12

-s 스위치 : 짜기 (반복 된 문자 제거)

echo i am a good boy | tr -s good bad

산출: i am a bd bdy

이런 일이 일어나도록 두 가지 일이 있습니다. 먼저 두 번째 인수가 tr첫 번째 인수 보다 짧은 경우 두 번째 인수 의 마지막 문자 가 첫 번째 인수와 동일한 길이로 반복됩니다. 따라서 동등한 명령은 다음과 같습니다.

echo i am a good boy | tr -s good badd

무슨 일이 일어나고 다른 것은 첫 번째 인수의 문자들이 이전 발생을 (내가 두 말하는 겁니다 덮어 반복 할 때입니다 oo에서의 good). 이제 명령이 다음과 같습니다.

echo i am a good boy | tr -s god bdd

(두 번째 od교체 이전 덮어 oa이 중복 만들기, 교체)

-s스위치가 없으면 출력은

i am a bddd bdy

-s스위치를 사용하면 마지막 출력을 떠나는 마지막 인수에 tr나열된 반복되는 문자를 '압축'합니다 .

i am a bd bdy

-c 스위치 : 보완

-c스위치는 첫 번째 인수 (즉, 인수 1에 나열되지 않은 모든 문자)의 보수를 일치시키는 데 사용됩니다. 결과적으로 arg 1에는 많은 문자 (256-3)가 포함됩니다. 이제, 앞의 경우와 마찬가지로 arg 2에서도 같은 일이 발생합니다. Arg 2의 마지막 문자는 길이 또는 Arg 1과 일치하도록 반복됩니다.

echo i am a good boy | tr -c good bad

다음과 같습니다.

echo i am a good boy | tr abcefhijklmnp... baddddddddddd...

(누락주의 g, o그리고 d첫 세트에서, 또한주의 d- 공백 문자를 포함하여 두 번째 세트의 다른 모든 문자를 대체합니다)

이 이유 i am a good boy에 회전dddddddgoodddodd

자세한 정보는 여기 : http://www.linuxjournal.com/article/2563


-s스위치가 입력에서 반복되는 마지막 인수 에서 첫 번째 tr문자가 아닌 문자를 눌렀다 는 점을 제외하고는 일반적으로 정확 합니다. 링크 된 기사에 나와 있으며 맨 페이지 의 "설명"섹션에있는 마지막 단락에서 설명 합니다 . tr
ravron

4

귀하의 이해 -s는 하나의 문자 입력에 설정 한 문자의 발생을 반복 대체 올바르지 않습니다. 예를 들어 세트를 수정하지 않습니다.

echo i am a good boy | tr -s god bad

준다

i am a bad bay

-c옵션은 세트 1을 보수 (즉, 세트 1에 포함되지 않은 모든 문자 세트)로 대체합니다. 이를 사용하여 예를 들어 지정된 문자를 제외한 모든 문자를 제거 할 수 있습니다.

echo i am a good boy | tr -cd gobdy

출력

goodboy

: -s 옵션에 관한 요점을 얻었지만 내 질문은 : how : echo i good boy | tr -s good bad는 다음과 같이 출력을 제공합니다 : 나는 이것이 bd bdy입니다. 즉 : 나는 bddd bdy이고 나로 변경되면 bd bdy는 실제로 일어나는 일입니까? -c 옵션과 동일하게이 문제를 해결하십시오. echo는 좋은 소년입니다. | tr -cd gobdy : 이것을주는 : goodboy

1

다른 답변 덮여 tr들 ' -s, -t-c옵션하지만 완전성을 위해 :

잘못된 도구를 선택했기 때문에 문제가 있습니다.

  • tr 문자 변환 용
  • sed 스트림 편집 용입니다.

스트림에서 goodbad문자 시퀀스 모두 sed가 더 적합합니다.

echo I am a good boy | <something> 나에게 출력을 제공합니다 : I am a bad boy

$ echo I am a good boy | sed s/good/bad/g
I am a bad boy

s/..../..../대체입니다. 첫 번째 정규식과 일치하는 것이 두 번째 정규식으로 바뀝니다. 마지막에있는 /g플래그는 이런 방식으로 전역 교체를위한 것이며 모든 경우는 처음이 아니라 교체됩니다.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/
I am a bad boy and a good boy is me.

$ echo I am a good boy and a good boy is me. | sed s/good/bad/g
I am a bad boy and a bad boy is me.

0

예. 바로 그거죠!

tr -s 반복되는 문자의 인스턴스를 단일 문자로 바꿉니다.

(man 페이지를 통해)

따라서 다음과 같이 진행됩니다.

로 변환 good됩니다 bddd. 반복되는 인스턴스는 3 'd입니다.

따라서이 세 인스턴스를 단일 인스턴스로 바꿉니다.

그것은 그것이 bd가되게하는 것입니다. :)


2
모든 답변이 완벽 할 것으로 예상하지는 않지만 올바른 철자, 문장 부호 및 문법으로 답변을 읽는 것이 더 쉽습니다.
Ashildr
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.