awk、sed、grep更适合的方向:
- grep 更适合单纯的查找或匹配文本
- sed 更适合编辑匹配到的文本
- awk 更适合格式化文本,对文本进行较复杂格式处理
grep
sed
基本命令
1 | sed [options] {'command'} {input_file} |
其中command
中可以指定地址范围 和 模式串范围 ,
1 | sed [options] {'[address-range|pattern-range] command'} {input fine} |
- 执行多条命令
-e
或{}
1 | sed [options] -e {'command1'} -e {'command2'} {input file} |
1 | sed [options] '{command1 command2}' {input file} |
这里 包围command
的大括号是必须的
常用参数
-n
: 屏蔽sed的默认输出(默认输出所有行)-i
: in-place,修改直接定向到源文件
替换命令
- 基本语法
1 | sed '[address-range|pattern-range] s/original-string/replacement-string/[substitute-flags]' input file |
Eg:
1 | sed '/Sales/ s/Manager/Load/' employee.txt |
上面/Sales/
为范围限制,后面的s
为替换命令,表示将Manager
替换为Load
。范围限制是可选的,默认是全部行。
- 全局替换
sed替换默认替换每行第一次出现的串,如果要全部替换需要加上g
。
1 | sed 's/a/A/g' employee.txt |
- 指定替换的数序
1 | sed 's/a/A/2' employee.txt |
替换第2次出现的a
- 写入
1 | sed -n 's/a/A/2 w output.txt' employee.txt |
注意用p
重定向到output时-n
是必需的。
- 忽略大小写
1 | sed 's/a/A/i' employee.txt |
- 将行串作为linux命令执行
1 | sed 's/^/ls -l /e' files.txt |
- 分界符
默认使用的/
分界符可能会与路径之类的字符串冲突,可用|, ^, @, !
等替换。
1 | sed -n 's@/usr/local/bin@/usr/bin@' path.txt |
- 同一行匹配执行多条命令
1 | sed -e 's/John/JJJ/' -e 's/JJJ/nnn' employee.txt |
一种是使用-e
,一种是大括号,中间用分号隔离。这种方法可以让后面的命令在上一个命令更改后的模式串上继续执行。