casyup.me@outlook.com

0%

other/sed

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
2
3
```shell
's/,//g'
```

​ 上述选项将会做出同样的效果

​ 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 字符串的那一行, 执行插入操作