sed
sed常用于处理文件, 它会逐行执行
基础选项
替换
s选项用于替换
1 | sed 's/text/val/' f.txt |
以上语句会将 f.txt 文本中的 text 替换成 val
@note: 但实际不会更改文件内容, 而仅仅是替换后打印出来
如果想作用于文件, 需要结合 -i 参数
删除
d选项删除
1 | sed '/text/d' f.txt |
以上语句会将f.txt 文本中出现 text 的行删除
@btw: 为什么这里的 d 在后面?
修改
c选项用于修改
1 | sed '/text/c test2' f.txt |
以上语句会将f.txt 文本中出现 text 的行修改成 test2
@note: 修改会修改整个一行
@btw:
从语义上来讲的话, 貌似理解成替换要合理一些. 因为是替换掉了整个一行
但是 c 选项的完整单词是 change(修改), 而 s 选项的完整单词是 substitute(替换)
所以, 遵从编写者的原意, 这里理解为修改整个一行
转换
y选项用于处理单个字符的转换
1 | sed 'y/10/22/' f.txt |
以上语句会将f.txt 文本中出现的 1 转换成2, 同时 0 也会转换成 2
@note: 可以将命令置于文件中, 然后使用 -f 选项指定文件
@btw: 替换类型的命令都是将选项置于行首, 其余均是置于行尾
取反
! 选项用于取反
1 | sed '/text/!d' f.txt |
删除不包含 text 文本的行
@btw: 如果SQL也能直接取反结果集就好了 = =
进阶
移动
n选项用于移动到下一行
1 | sed '/text val/{n;d}' f.txt |
当这条语句匹配到 text val 时, 会跳转到下一行, 然后删除行(删除的是匹配行的下一行)
合并两行
N选项用于将两行的数据视为一行来处理
1 | sed '/text val/{N;d}' f.txt |
这条语句会将匹配行, 及匹配行的下一行, 当做一行处理(一起删掉)
@btw: 同样的格式还有
1 | sed 'N; /text val/d' f.txt |
它会完成和上个指令一样的操作
选择性删除
D选项… 怎么说呢 = = , 看实例吧
1 | sed '/text val/{N;/val text/D}' f.txt |
当某一行有 text val 时, 并且下一行有 val text 时
D选项会删除前一个匹配行(也就是说 text val 所在的行会被删除)
多行打印
emmmm, 略(并不是说不会, 而是感觉没什么用)
(N和D其实运用上已经很少了, P就更少了…)
保持空间
emmmm, 略
(倒不是说保持空间没用, 相反, 保持空间在某些特定的场合)
(它能起到独一无二的作用, 但是现在对于我来说, 了解一下就好 = =)
分支
b选项用于跳过一些分支(b完整的单词是 branch, 但是我觉得 break 怎么更好 = =)
1 | sed '{2, 3b; s/10/\\/}' f.txt |
命令会将 10 替换成 \ , 但是会跳过 2 - 3 行
@btw: 分支可以指定标识符, 就像goto一样. 这里就直接给一个书上的例子
emmmm, 将第一行标记(其实也只有第一行)
每次将一个逗号删除(其实是替换), 循环替换
@btw:
看似很厉害, 实则没啥用, 因为可以用 g
1 | ```shell |
上述选项将会做出同样的效果
emmm, 我是不是忘了说 g ?
g 代表修改会作用于一整行, 当然 也可以使用数字来指定
测试
略
模式替代
通配符 &
& 用于匹配模式
1 | sed 's/.0/"&"/g' f.txt |
& 匹配整个模式, 以上语句将会用 “” 把所有 0 及 0前面 的支付括起来
也可以使用单个模式
1 | sed 's/\(.\)\(0\)/\1 32/g' f.txt |
() 括起来的部分视为一个模式, \1 引用一个模式
上述语句将会把所有以 .0 的语句替换为 . 32
@note:
这个例子将会只保留 . 匹配的内容, 而 & 将会保留所有内容
& 模式匹配是我在进阶章里面看到的最有用的东西
emmm, 关于 sed 的内容还有一些, 不过现在就先到这里吧 = =
@supplement
模式匹配: 增/删/改中可以运用模式匹配
1 | sed '/test/i\this is a test' t.txt |
这条语句将会在有 test 字符串的那一行, 执行插入操作