注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Tsecer的回音岛

Tsecer的博客

 
 
 

日志

 
 

tr命令使用说明  

2017-06-30 21:34:22|  分类: GNU工具链源码分 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
一、为什么想到这个工具
grep是用来作行提取,awk做字段提取,而tr是基于更小粒度的字符提取,所以一个典型的文本提取可能会依次在管道中用到grep、awk和tr三个工具。之前对于tr这个工具几乎没怎么关注到,但是在有时候作信息提取的时候,还是要用到这个工具做一些更小粒度的修剪。例如,通常文本为了便于阅读都会有一些额外的装饰信息,例如引号,分号,空格这类零碎信息,这个时候就可以通过tr来进行这些特殊字符的删除,再具体点说,就是使用tr的delete功能。
二、tr工具的主要功能
从tr的源码可以看到delete在整个选项处理中占有比较扎眼的位置,下面的代码写的比较绕,通常来说,这种比较绕的代码写的人比较爽,但是看代码的人比较难受了,这个体验据说和看爱情动作片刚好相反。看了半天,我觉的一个总结来说,就是delete有否决transalte的特权,squeeze_repeats是百搭选项。
coreutils-8.8\src\tr.c
int
main (int argc, char **argv)
{
……
  non_option_args = argc - optind;
  translating = (non_option_args == 2 && !delete);
  min_operands = 1 + (delete == squeeze_repeats);
  max_operands = 1 + (delete <= squeeze_repeats);
……
三、那么问题来了
man手册中对于选项的说明,明确说明delete和translate是互斥的,并且delete是有一票否决权的,但是对于squeeze的说明着墨不多,几乎是一笔带过:
       -d, --delete
              delete characters in SET1, do not translate

       -s, --squeeze-repeats
              replace each input sequence of a repeated character that is listed in SET1 with a single occurrence of that character

1、delete和squeeze的共存
int
main (int argc, char **argv)
{
……
  spec_init (s1);
  if (!parse_str (argv[optind], s1))
    exit (EXIT_FAILURE);

  if (non_option_args == 2)
    {
      spec_init (s2);
      if (!parse_str (argv[optind + 1], s2))
        exit (EXIT_FAILURE);
    }
  else
    s2 = NULL;
……
  else if (squeeze_repeats && delete && non_option_args == 2)
    {
      set_initialize (s1, complement, in_delete_set);
      set_initialize (s2, false, in_squeeze_set);
      squeeze_filter (io_buf, sizeof io_buf, read_and_delete);
    }
从代码上看,是delete先执行,然后再执行squeeze。并且参数中的第一个set始终作为delete的依据,第二个set始终作为squeeze的依据。
2、translate和squeeze的共存
第二个set即作为translate的目标字符集,同时也是作为squeeze字符集。
      if (squeeze_repeats)
        {
          set_initialize (s2, false, in_squeeze_set);
          squeeze_filter (io_buf, sizeof io_buf, read_and_xlate);
        }
总起来说,squeeze始终是作为最后一个操作步骤。
3、效果
同时指定delete和squeeze
tsecer@harry: echo "xdxdx" | tr -s -d "d"   "x" 
x
同时使用translate和squeeze
tsecer@harry: echo "xdxdx" | tr -s  "d"   "x" 
x
  评论这张
 
阅读(13)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017