shell中sed的使用

这里记录一下sed的使用, 并不会总结得很全,只是一些常见使用方法。 推荐一篇很好的sed的总结性文章点击这里 (是英文的,可能需要翻墙)

sed的常用方法

1. 替换字符串

1. 例子1(简单替换)
echo 'caesar is king' | sed 's/caesar/pig/'       
# 输出结果: pig is king

这是最简单的使用方式,其中caesar作为被替换的字符串, pig作为替换字符串。

2. 例子2(全局替换)

sed是每一行,每一行的流式操作的。

echo -e 'caesar is king, caesar\ncaesar is a girl' | sed 's/caesar/pig/'       
# 输出结果: pig is king, caesar
#           pig is a girl

可以看到sed只是把每一行的第一个caesar替换了, 不会替换所有的caesar, 替换每一行的所有caesar,需要加g选项

echo -e 'caesar is king, caesar\ncaesar is a girl' | sed 's/caesar/pig/g'       
# 输出结果: pig is king, pig
#           pig is a girl

tip: echo-e选项是输出字符串会经过转义,\n表示到下一行(linux)

3. 例子3(正则替换)

当然这里字符串的替换是可以使用正则表达式的, 一个例子如下:

echo -e 'caesar is king\ncurrent' | sed 's/^c[a-z]*/pig/'       
# 输出结果: pig is king
#           pig

这里将以c开头的单词替换为pig

再来一个复杂的例子,比如用shell脚本进行代码的混淆时, 我想找到objective-c代码的方法,比如我的方法是这样的格式的

- (instancetype)mc_initWithTitle:(NSString *)title{
}

而我想要提取出mc_initWithTitle这个方法名;

echo -e '- (void)mc_initWebView:(Nstring)3\n+ (void)mc_init;' | sed -r 's/^[-+] \(.*\)(mc_[0-9a-zA-Z_]*)([\;\:].*)?/\1/'     
# 输出结果: mc_initWebView
#           mc_init

这里-r选项是--regexp-extended,也就是正则扩展的意思, 不然sed的正则是不会识别()+这些符号的,这里一步步解释:
1:^[+-]代表以+或者-号开头;
2:空格就原样填写就行;
3:\(.*\)表示匹配任何单词加圆括号的东西,如(void), (unsigned);
4:(mc_[0-9a-zA-Z_]*)就是匹配方法名了;
5:([\;\:].*)?表示各种方法后的符号, 有: 有; 也可以什么都没有;
6:\1表示将之前匹配项1, 也就是(mc_[0-9a-zA-Z_]*)作为替换项进行替换
我们就得到了我们的方法名了;

4. 不使用/作为分隔符

也可以不使用/作为分隔符

sed 's_/usr/local/bin_/common/bin_' <old >new
sed 's:/usr/local/bin:/common/bin:' <old >new
sed 's|/usr/local/bin|/common/bin|' <old >new

这里改用_ : |这三符号也行, 这样的话就可以不转义/就可以识别/

5. &的使用
echo "123 abc" | sed 's/[0-9]*/& &/'
# 输出:123 123 abc

&作为匹配项;

echo "123 abc" | sed 's/[^ ]*/(&)/g' 
# 输出:(123) (abc)

给单词加上括号

6. /1 /2匹配第一个、匹配第二个
echo "abc def" | sed -r 's/[a-z]+/000/1'
# 输出: 000 def
echo "abc def" | sed -r 's/[a-z]+/000/2'
# 输出: abc 000
echo "abc def ghi" | sed -r 's/[a-z]+/000/2g'
# 输出: abc 000 000

2g代表从第二个开始

2.其他操作

1. /p 打印

默认sed会打印所有行, 添加-n参数,sed之后打印改变行

echo -e "abc def ghi\n12" | sed -n 's/abc/&/p'
# 输出:abc def ghi

这是使用sed实现了grep的操作

2. /p 打印指定行
echo -e "line1\nline2\nline3" | sed -n '1p'
# 输出:line1
echo -e "line1\nline2\nline3" | sed -n '1,2p'
# 输出:line1
#      line2
echo -e "line1\nline2\nline3" | sed -n '$p'
# 输出:line3
# $p是打印最后一行
2. /I 忽略大小写
echo -e "abc\nABC" | sed -n '/abc/I p'
# 输出:abc
#      ABC
3. 组合操作
echo -e "abca" | sed -n 's/a/A/2pw /tmp/file' 
# 输出:abcA
#  并写入到/tmp/file   tip:w要放在最后
4. -e多命令组合
echo -e "abc" | sed -e 's/a/A/' -e 's/b/B/'
# 输出:ABc
5. 多文件
sed 's/^#.*//'  file1 file2 file3 | grep -v '^$' | wc -l
# 输出:输出多个文件中不是以#开头的行的行数

还有一个普遍使用方法是

sed 's/^#.*//'   `grep -lr  "pattern" dir`
# grep -lr dir输出文件夹dir下匹配pattern的文件

先写到这吧
todo: 写label g&G、 h&H、 x、 b、{}、

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,265评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,078评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,852评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,408评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,445评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,772评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,921评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,688评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,130评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,467评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,617评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,276评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,882评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,740评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,967评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,315评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,486评论 2 348

推荐阅读更多精彩内容

  • 本文承接之前写的三十分钟学会AWK一文,在学习完AWK之后,趁热打铁又学习了一下SED,不得不说这两个工具真的堪称...
    mylxsw阅读 4,391评论 3 74
  • grep擅长查找,awk擅长分析(select),sed擅长批量编辑行 概述 SED的英文全称是 Stream E...
    piziyang12138阅读 933评论 0 3
  • grep擅长查找,awk擅长分析(select),sed擅长批量编辑行概述SED的英文全称是 Stream EDi...
    Arroganter阅读 1,066评论 0 7
  • 简介 sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(p...
    699b979fc4da阅读 990评论 0 1
  • 拖延癌是种什么体验? 大概就是我从5月份看到了新媒体创作大赛的征文启事,正好当时手头有些事情,再加上报名截止日期还...
    本小喵阅读 170评论 0 0