Làm thế nào để các tùy chọn '-s', '-t' và '-c' của lệnh tr hoạt động trong Unix?


12

Tôi bối rối về đường đi -s, -t-ctùy chọn làm việc trong tr lệnh. Khi tôi làm

echo I am a good boy | tr good bad

Tôi nhận được đầu ra:

I am a bddd bdy

Điều này là khá dễ hiểu, vì ođược lặp lại trong good. Sự thay đổi cuối cùng có thể thay thế od, và do đó là đầu ra.

Bây giờ khi tôi làm

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

đầu ra là

I am a bd bdy

Các -stùy chọn có nghĩa vụ phải ép mọi điều xảy ra lặp đi lặp lại của mỗi nhân vật trong bộ 1 vào một sự xuất hiện duy nhất và sau đó thay đổi mỗi nhân vật trong bộ 1 vào nhân vật tương ứng trong tập 2 mà là ở vị trí tương đương.

Vì vậy, nó nên được

I am a bad bay.

Tại sao thay đổi?

Hơn nữa, khi tôi làm

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

tôi có dddddddgoodddodd

Làm thế nào để -ctùy chọn làm việc cho tr, tham khảo ví dụ này?

Và cuối cùng: làm thế nào để thay đổi bản thân từ một cậu bé ngoan thành một cậu bé hư .... :): P Đó là,

echo I am a good boy | tr <something>cung cấp cho tôi đầu ra là : I am a bad boy.

Câu trả lời:


12

-s Switch: Bóp (loại bỏ các ký tự lặp lại)

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

đầu ra: i am a bd bdy

Có hai điều xảy ra đằng sau hậu trường khiến điều này xảy ra. Thứ nhất, nếu đối số thứ hai trngắn hơn đối số thứ nhất thì ký tự cuối cùng trong đối số thứ 2 được lặp lại để làm cho nó có cùng độ dài với đối số thứ nhất. Vì vậy, lệnh tương đương là:

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

Một điều khác đang xảy ra là khi các ký tự trong đối số đầu tiên được lặp lại, chúng sẽ ghi đè lên bất kỳ lần xuất hiện nào trước đó (tôi đang đề cập đến hai oos in good). Điều này làm cho lệnh bây giờ tương đương với:

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

(cái thứ hai ođể dthay thế ghi đè lên cái trước ođể athay thế, làm cho nó trở nên dư thừa)

Nếu không có công -stắc, đầu ra sẽ là

i am a bddd bdy

Với công -stắc tr'bóp' bất kỳ ký tự lặp lại nào được liệt kê trong đối số cuối cùng để lại đầu ra cuối cùng:

i am a bd bdy

-c Chuyển đổi: Bổ sung

Công -ctắc được sử dụng để khớp với phần bù của đối số đầu tiên (tức là tất cả các ký tự không được liệt kê trong đối số 1). Kết quả là arg 1 sẽ chứa nhiều chữ cái (256-3). Bây giờ, điều tương tự cũng xảy ra với arg 2 như trong trường hợp trước: Ký tự cuối cùng của Arg 2 được lặp lại để khớp với độ dài hoặc Arg 1. Vì vậy, câu lệnh gốc:

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

tương đương với:

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

(lưu ý thiếu g, odtrong tập đầu tiên, cũng lưu ý rằng dsẽ thay thế mọi ký tự khác trong tập thứ hai - bao gồm cả ký tự khoảng trắng)

Đây là lý do tại sao i am a good boybiến thànhdddddddgoodddodd

Thêm thông tin ở đây: http://www.linuxjournal.com/article/2563


Nói chung là chính xác, ngoại trừ việc -schuyển đổi gây ra trép bất kỳ ký tự nào từ đối số cuối cùng sang tr(không phải là đầu tiên, như bạn nói) được lặp lại trong đầu vào. Điều này được ghi chú trong bài viết bạn liên kết và được giải thích trong đoạn cuối trong phần "Mô tả" của trang man .
ravron

4

Sự hiểu biết của bạn -slà không chính xác, nó thay thế các lần xuất hiện lặp lại của các ký tự trong bộ 1 trong đầu vào bằng một ký tự duy nhất. nó không sửa đổi tập hợp, vd.

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

cho

i am a bad bay

Các -cThay thế tùy chọn thiết lập 1 với sự bổ sung của nó (ví dụ. Các thiết lập của tất cả các nhân vật không có trong bộ 1). Bạn có thể sử dụng điều này để loại bỏ tất cả trừ các ký tự được chỉ định chẳng hạn.

echo i am a good boy | tr -cd gobdy

đầu ra

goodboy

: Tôi có quan điểm của bạn về tùy chọn -s, nhưng câu hỏi của tôi là, làm thế nào: echo tôi là một cậu bé ngoan | tr -s tốt xấu là cho đầu ra như sau: tôi là một bd bdy điều này chỉ có thể xảy ra khi điều này xảy ra: đầu tiên tôi là một cậu bé tốt được đổi thành tôi là một bddd sau đó tùy chọn -s thay đổi sự xuất hiện của nhiều d thành một tức là: tôi là một bddd bdy sau đó thay đổi thành tôi là một bd bdy đây có phải là những gì đang thực sự xảy ra? làm ơn chia nhỏ cái này cho tôi, cùng với tùy chọn -c làm thế nào là tiếng vang tôi là một cậu bé ngoan | yêu tinh tr -cd đưa ra điều này: goodboy

1

Những câu trả lời khác che tr's -s, -t-ctùy chọn nhưng cho đầy đủ:

Bạn đang gặp rắc rối vì bạn đã chọn sai công cụ.

  • tr dành cho chuyển đổi nhân vật
  • sed là để chỉnh sửa luồng.

Vì cả hai goodbadlà chuỗi các ký tự trong luồng sedlà kết hợp tốt hơn.

echo I am a good boy | <something> cung cấp cho tôi đầu ra là: I am a bad boy

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

Đây s/..../..../là thay thế. Bất cứ điều gì phù hợp với biểu thức chính quy đầu tiên sẽ được thay thế bằng biểu thức thứ hai. Các /glá cờ ở cuối là để thay thế toàn cầu theo cách này tất cả các lần xuất hiện sẽ được thay thế không chỉ là người đầu tiên.

$ 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

Đúng. chính xác!

tr -s thay thế các trường hợp của các ký tự lặp lại bằng một ký tự duy nhất.

(thông qua trang người đàn ông.)

vì vậy, nó đi như thế này:

nó chuyển đổi goodthành bddd. trường hợp lặp đi lặp lại là 3 'd.

vì vậy nó thay thế ba trường hợp này bằng một thể hiện duy nhất.

đó là nó làm cho nó bd. :)


2
Chúng tôi không mong đợi mọi câu trả lời là hoàn hảo, nhưng câu trả lời với chính tả, dấu câu và ngữ pháp chính xác sẽ dễ đọc hơn.
Ashildr
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.