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

export PATH=$(echo $PATH | sed 's/:/\n/g' | sort | uniq | tr -s '\n' ':' | 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. 将原本的':'替换为'\n', 因为最后一组不存在':',而在排序后并不确定哪一组会排在最后,所以并不是追加换行符
2. 排序
3. 去重
4. 将'\n'替换为':'
5. 将最后一个:删去

完成

sed tr 去除PATH中的重复项的更多相关文章

  1. 如何去除PATH里的重复项并排序

    注意sed的用法,linux和Mac os不同,linux是Gnu的,Mac是BSD的 PATH排序去掉重复内容 mac和linux的换行符替换方法不一样,如下是Mac下的操作 export PATH ...

  2. js 巧妙去除数组中的重复项

    1.代码如下: var toObject = function(a) { var o = {}; for (var i=0, j=a.length; i<j; i=i+1) { // 这里我调整 ...

  3. c#去除List中的重复项

    List<string> list = new List<string> {"a", "a", "b", " ...

  4. arts打卡 从排序数组中删除重复项

    Algorithm 从排序数组中删除重复项     给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组 ...

  5. LeetCode(26): 删除排序数组中的重复项

    Easy! 题目描述: 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间 ...

  6. [LeetCode] 82. Remove Duplicates from Sorted List II 移除有序链表中的重复项 II

    Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct numb ...

  7. PHP二维数组--去除指定列含有重复项的数组

    给定二维数组: $arr = array( '0' => array('张三',2,3,4), '1' => array('李四',2,3,4), '2' => array('张三' ...

  8. [CareerCup] 2.1 Remove Duplicates from Unsorted List 移除无序链表中的重复项

    2.1 Write code to remove duplicates from an unsorted linked list.FOLLOW UPHow would you solve this p ...

  9. C/C++面试之算法系列--去除数组中的重复数字

    去除数组中的重复数字 Sailor_forever  sailing_9806@163.com 转载请注明 http://blog.csdn.net/sailor_8318/archive/2008/ ...

随机推荐

  1. android中工作线程安全

    当应用程序启动,创建了一个叫“main”的线程,用于管理UI相关,又叫UI线程.其他线程叫工作线程(Work Thread). Single Thread Model 一个组件的创建并不会新建一个线程 ...

  2. 【iCore3双核心板】发布 iCore3 应用开发平台硬件原理图

     原理图PDF下载地址:http://pan.baidu.com/s/1jHY0hNK iCore3应用开发平台购买地址:https://item.taobao.com/item.htm?spm=a1 ...

  3. insert操作卡死的处理过程

    insert操作卡死的处理过程 先看看insert为什么被卡死 SQL> select sql_id from v$sql where sql_text like 'delete from st ...

  4. mockito使用心得

    前提:pom引用<dependency> <groupId>junit</groupId> <artifactId>junit</artifact ...

  5. Clang比 gcc/g++更人性化代码出错提示的C/C++编译器

    编译器方面的几个命令 gcc/g++ 一. 常用编译命令选项 常用用法 gcc -Wall test.c -o test gcc编译过程 .c ->(-E)-> .i[中间文件] -> ...

  6. get back to the slower clock rate that allows it to save more power

    http://www.howtogeek.com/177790/why-you-cant-use-cpu-clock-speed-to-compare-computer-performance/ Wh ...

  7. yii2.0场景的使用

  8. 关于IOS音频的开发积累

    1.设置类别,表示该应用同时支持播放和录音 OSStatus error; UInt32 sessionCategory = kAudioSessionCategory_PlayAndRecord; ...

  9. 极简Photoshop 教程

    本文通过创建一个iPhone应用的启动界面来介绍常用的Photoshop 用法. 1,以下参数创建一个新图像 宽度:1242像素,高度:22208像素,分辨率:401,背景内容:透明,其它默认 2,建 ...

  10. scrollViewDidEndScrollingAnimation和scrollViewDidEndDecelerating的区别

    #pragma mark - 监听 /**  *  点击了顶部的标题按钮  */ - (void)titleClick:(XMGTitleButton *)titleButton {     // 修 ...