「Efficient Android Threading 笔记」- C1 Android Components and the Need for Multiprocessing Android RecyclerView Android Socket Programming Supporting Multiple Screens Make a Reusable UI in Android App Development 如何在 Android Studio 中包含 *.so library,并使用库中定义的方法? 使用 SpannableString 格式化字符串,实现前景色、下划线、超链接、图文混排等 如何使用 bound service 完成进程间通信? 创建自定义视图 Creating custom views 通过 Android Theme & Style 定制应用的样式 「译」Android ViewPropertyAnimator 介绍 Android Animation Interpolator - Android 动画插值器源码笔记 「译」Android Animation in Honeycomb by Chet Haase(Android 3.0系统中的动画机制) 从 Android Sample ApiDemos 中学习 android.animation API 的用法 如何学习 Android Animation? 如何实现 Android ListView「上拉加载更多」? 「译」向Big Nerd Ranch提问:为什么Fragment在Android App开发中非常重要? 分类整理我在 SegmentFault 上针对某些问题作的回答 Android Servcie 后台服务总结笔记 如何在Android设备旋转时暂存数据以保护当前的交互状态? Android Message Handler 消息处理机制总结笔记 如何获取FragmentTabHost中指定标签页的Fragment? Fragment子类必须包含一个public无参构造器 如何更新及替换ViewPager中的Fragment? 如何使用Android UI Fragment开发“列表-详情”界面? 一个Android音频文本同步的英文有声读物App的开发过程 「Android编程权威指南笔记」Android应用本地化 通过jfeinstein10/SlidingMenu实现Android侧滑菜单 为Ubuntu14.04部署Android App的Eclipse开发环境 「Android编程权威指南笔记」使用ListFragment显示列表 「Android编程权威指南笔记」SDK版本与兼容 「Android编程权威指南笔记」Android布局和组件 「Android编程权威指南笔记」UI Fragment 「Android编程权威指南笔记」Activity 第一次开发iOS App和Android的对比总结笔记 「App Training笔记」创建第一个应用 「App Training笔记」开发入门训练大纲 Android APP - 从远程FTP服务器下载文件到本地

Shell FAQs - 文本查找-替换-排序

2014年05月01日

sed与awk优劣比较

原帖由 jixunuli 于 2006-2-17 10:54 发表-Shell-ChinaUnix.net

虽然两者都是处理文本的,但是 两者各有所长,有的功能用sed实现起来比较方便,另一些则用awk方便。
对,waker 版主举的就是一个例子。 他那个问题用 sed 很容易解决,但是用 awk 就比较费劲。
其实这也就是我学习 Perl 的原因,
shell 下工具众多,功能也互相重复,
最头疼的是,这些重复部分的语法还各不相同,(比如 grep awk sed 都有正则表达式匹配的功能,但是三者的正则表达式语法就不相同)。
最最最头疼的是,每个工具还分 GNU 版和不是 GNU 版,之间的差别也很大,
最最最最最头疼的是,即使都是 GNU 版,那么版本号的细微差别也会带来很多差别。
但是,用 Perl 做这些事,统统都能办到,而且统统都不太复杂。

打印字符串的前几个字符

Different ways to print first few characters of a string in Linux - The UNIX School

$ cat file
Linux
Unix
Solaris

while read line
do
    echo ${line:0:3}                   # ${line:0:3}是内建命令,从0编号,提取字符串line的前3个字符
done < file

$ cut -c 1-3 file                      # cut剪下指定的字符范围
$ grep  -o "^..." file                 # --only-matching, show only part of a line matching PATTERN
$ grep -o '^.\{3\}' file               # 区间表示式 .\{3\} 表示出现3次点号
$ awk '{ print substr($0,1,3) }' file  # awk的字符串提取函数substr,从1编号
$ sed 's/\(...\).*/\1/' file           # sed执行文本替换
$ sed 's/\(.\{3\}\).*/\1/' file
Lin
Uni
Sol
$

替换字符串

Using grep and sed to find and replace a string - Stack Overflow

grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g'     或者
find /path -type f -exec sed -i 's/oldstr/newstr/g' {}  \;  或者
find /path -type f | xargs sed -i 's/oldstr/newstr/g'
  • grep 选项-l, --files-with-matches print only names of FILEs containing matches,仅 每行一个 列出文件名。
    如果没加-l,sed会提示错误sed: can't read path/file No such file or directory
    grep默认输出格式是:/path/from/grep/: pattern in this line
    选项-Z, --null print 0 byte after FILE name,打印匹配pattern的行。和grep没加任何选项时效果一致。
    xargs把grep的输出一行一个传递给sed,sed从中读取文件名,直至遇到空白符,
    所以sed读到的是/path/from/grep/: 文件名中多了一个冒号,所以sed报错。

  • grep 选项 ` -i[SUFFIX], –in-place[=SUFFIX] edit files in place (makes backup if extension supplied) 如果不加i`,只在终端打印替换的效果,不会修改原文件。

  • {} \; The braces are the current filename as exec’d by find and without them sed will complain.

  • grep -rl oldstr path | xargs sed -i 's/oldstr/newstr/g' /dev/null 会提示 sed: couldn't edit /dev/null: not a regular file.

查找包含2个、不在同一行的关键词的文件

使用egrep 1条命令就可以完成:

grep -Erw "pattern1 | pattern2" .    或者
egrep -rw "pattern1 | pattern2" .

使用grep,需要2条命令:

find . -type f -exec grep -rl pattern1 {} \; | xargs  grep -Z pattern2    或者
grep -rl pattern1 . | xargs grep pattern2 .

版本

li2 于上海闸北
2014-04-15 ~ 2014-05-15, v1


知识共享许可协议
li2的博客WeiYi.Li 创作,采用 知识共享 署名-非商业性使用 4.0 国际 许可协议进行许可。
© 2011-2017. All rights reserved by WeiYi.Li. Powerd by Jekyll & LinAnYa's Theme