tr 命令的“-s”、“-t”和“-c”选项在 Unix 中如何工作?

tr 命令的“-s”、“-t”和“-c”选项在 Unix 中如何工作?

-s我对、-t-c选项的工作方式感到困惑tr命令。当我这样做时

echo I am a good boy | tr good bad

我得到输出:

I am a bddd bdy

这是完全可以理解的,因为o在 中重复了good。 的最后一个可能变化od,因此输出为 。

现在当我这样做

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

输出是

I am a bd bdy

-s选项应该将集合 1 中每个字符的每次重复出现压缩为一次出现,然后将集合 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

答案1

-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中的两个 s good)。这使得该命令现在等效于:

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

(第二个o替换d将覆盖前一个o替换a,使其变得多余)

如果没有-s开关,输出将是

i am a bddd bdy

使用-s开关tr“挤压”列出的任何重复字符最后的留下最终输出的参数:

i am a bd bdy

-c开关:补充

-c开关用于匹配第一个参数的补码(即参数 1 中未列出的所有字符)。因此,参数 1 将包含许多字母(256-3)。现在,参数 2 也会发生与前一种情况相同的事情:参数 2 的最后一个字符会重复以匹配参数 1 的长度。因此原始语句:

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

相当于:

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

(请注意第一组中缺少的go和,还请注意将替换第二组中的每个其他字符 - 包括空格字符)dd

这就是为什么i am a good boy变成dddddddgoodddodd

更多信息请点击这里:http://www.linuxjournal.com/article/2563

答案2

您对 的理解-s是错误的,它用单个字符替换输入中集合 1 中重复出现的字符。它不会修改集合,例如。

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

答案3

其他答案涵盖了tr-s-t选项-c,但为了完整性:

您遇到麻烦是因为您选择了错误的工具。

  • tr用于角色转换
  • sed用于流编辑。

由于和good都是bad流中的字符序列,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.

答案4

对,就是这样!

tr -s用单个字符替换重复字符的实例。

(通过手册页。)

因此,它是这样的:

它转换goodbddd。重复实例是 3 个“d”。

因此它用一个实例替换这三个实例。

就是这样,它使它成为bd。:)

相关内容