• sed tr 去除PATH中的重复项


    最近发现由于自己不良的安装软件的习惯,shell的PATH路径包含了很多冗余的项。这里使用shell命令去除PATH的冗余项。

    export PATH=$(echo $PATH | sed 's/:/
    /g' | sort | uniq | tr -s '
    ' ':' | sed 's/:$//g')
    

    上面的代码可以去除linux环境变量中的重复项。


    最近查看环境变量时,发现PATH中包含了很多重复项,而在~/.bashrc中又没有看到什么重复的指令,只好手动去重了。

    起先在网上看到有人使用awk命令,如下:

    awk -F: '{
           sep = ""
           for (i = 1; i <= NF; ++i)
                   if (unique[$i] != 1){
                           out = out sep $i
                           sep = ":"
                           unique[$i] = 1
                   }
                   print out
    }' <<< $PATH
    

    但是我发现如果使用这份代码的话每次进行source更新时就会在原本的PATH路径下重复增加一些内容。而我对bash还不太熟,决定学一下,然后自己写一份。


    #主要的指令
    #替换
    sed 's/旧的字符串/新的字符串/g'
    #去重
    uniq
    #排序
    sort
    替换
    tr -s '旧的字符' '新的字符' 
    

    因为目的是去重,所以一定要使用uniq指令,查看用法的话,有两点需要注意:
    1. uniq只能用于行间去重
    2. 重复的行必须相邻

    解决方案:
    1. 对PATH变量进行适当的换行符替换
    2. 使用sort排序,使重复的行相邻

    字符替换

    sed和tr都是用于替换,为什么要使用两种呢?

    tr算是一种轻量级的替换方法了,直接将符合的字符替换,不支持正则表达式。用来替换换行符比较方便。但如果想要做稍微复杂点的事情就比较困难了。
    sed比较强大,支持正则表达式,但是它对换行符有自己的一套处理方式,增加时还比较正常,但我还尚未找到去掉的方法。

    在我的处理过程中,有这样的步骤
    1. 将原本的':'替换为' ', 因为最后一组不存在':',而在排序后并不确定哪一组会排在最后,所以并不是追加换行符
    2. 排序
    3. 去重
    4. 将' '替换为':'
    5. 将最后一个:删去

    完成

  • 相关阅读:
    Java swing 代码例子
    MySql
    swing 下拉菜单
    uiautomator2.0的配置的两种方法
    【Java】边框总结
    Java可视操作界面例子
    Java多线程例子
    使用Java让android手机自动执行重复重启
    形参的一种特殊写法
    this 基础使用方法
  • 原文地址:https://www.cnblogs.com/darryo/p/sed-tr-qu-chuPATH-zhong-de-zhong-fu-xiang.html
Copyright © 2020-2023  润新知