文本三剑客(sed)
- 使用场景
- 基本语法
- 实例
- 命令列表
使用场景
sed提供了一种面交互的方式修改文件内容。
它是一行一行处理,可以通过正则匹配要修改的部分
基本语法
-
基本语法
sed [-opt] command files(多个文件 空格隔开) -
sed 使用正则
sed -r “正则匹配数据行/指定行号 sed命令” files -
sed 修改内容写回文件
默认,sed操作完的数据会显示在控制台,而不会回写到文件中; 若要将变更保存到文件可以使用 -i 选项sed -ri “/正则表达式/或者指定行号 + [{]sed命令[}]” files
sed 命令可以使用 {} 括起来,也可以不写,写了意思更明确。类似$var 和 ${var}
如果要对选中的行执行多个操作可以使用 分号(;) 隔开 sed命令
sed -r "\regex expression\{s;r}" file
- 行号表示法匹配多行使用逗号分割两个行号($ 表示最后一行)
# 删除 1 到 2 行
sed -r "1,2{d}" file
实例
命令列表
- d 删除匹配的行
// 删除正则匹配的行
sed -r “/正则表达式/{d}” file
// 删除指定行
sed -r “行号{d}” file- 按正则表达式删除
sed -r "/regex expression/d" file
- 删除第二行
sed -r "2d" file
- 删除 2-5行
sed "2,5{d}" file
- 删除5行到最后一行
sed -r "5,$d" file
- 删除最后一行
sed -r "$d" file
- s 替换匹配上的字符
sed -r “s/正则查找的内容/要替换的内容/” file
也可以使用 # 分割,当要替换的内容中有/或其他特殊含义字符时可以使用#,或者使用转义
sed -r “s#正则查找的内容#要替换的内容#” file
默认,只会替换每一行中的第一个匹配上的字符串;如果要全部替换,需要在最后的 / 后加个g,代表行内匹配上的字符串都替换
```bash
# 将含有 abc 的行 的第一个 abc 换成 def
sed -r “s/abc/def/” file
# 将含有 abc的行 的所有 abc 都换成 def
sed -r "s/abc/def/g" file
````
sed 的 s 命令中,如果要**引用查找到的字符串**可以使用() + \1 或 & 获取
和 vim 中 类似。
- r 读取文件,写入到sed指定的文件
读取一个文件的内容,默认会追加到 sed指定的文件中的每一行下面。
如果要追加在目标文件的指定行的下面,
可以在 r前面加上行号,同样,这里可以使用$表示最后一行
还可以使用正则匹配行,在匹配上的每一行下面都会追加读取到的内容,注意正则表达式使用 / / 分割
# 取sourcefile的内容, 追加到 destfile每一行后面
sed -r 'r sourcefile' destfile# 读取sourcefile的内容, 追加到 destfile最后一行后面
sed -r '$r sourcefile' destfile# 读取sourcefile的内容, 追加到 destfile第一行后面
sed -r '1r sourcefile' destfile# 读取sourcefile的内容, 追加到 正则表达式匹配上的每一行后面
sed -r '/正则表达式/r sourcefile' destfile
- w 写入文件,读取sed指定文件的内容写入另一个文件
将 sed指定的文件 sourcefile,另存为另一个文件 destfile
同样可以使用 行号或者 正则,选中想要保存的部分行,这样就是匹配上的行保存到目标文件中。
# 将 整个sourcefile文件内容写入 destfile
sed -r 'w destfile' sourcefile# 将sourcefile文件 指定行写入 destfile
sed -r '1w destfile' sourcefile# 将sourcefile文件 指定范围行写入 destfile
sed -r '1,5w destfile' sourcefile# 将sourcefile文件 正则匹配上的行 写入 destfile
sed -r '/正则表达式/w destfile' sourcefile
- a 追加内容,在匹配行下面写入数据
和上面一样,可以使用固定行号,范围行号以及正则表达式匹配要追加的行,不限制时,应用到每一行。
追加多行可以使用 \n 转义实现
# 给file文件每一行下面添加一行 123
sed -r 'a 123' file每一行下面追加两行123
sed -r 'a 123\n123' file
-
i 插入内容,在匹配行上面写入数据
规则与上面 a 类似,只是内容写到匹配行的上面 -
c 替换匹配上的整行内容
规则与上面a 类似,对匹配上的行,整行替换
# 第一行替换为 123
sed -r '1c 123' file# 第一行到第二行替换为 123
sed -r '1,2c 123' file# 匹配上正则的行 替换为 123
sed -r '/正则表达式/c 123' file
- n 匹配当前行,组合其他sed命令作用到下一行
需与其他命令结合使用,n命令仅仅用于查找,组合的其他命令才是作用到下一行的命令
# 删除第二行
sed -r '1n;d' file
- ! 反选;对匹配的结果取反,然后应用后面的sed命令
# 删掉 除了第一行的其他行
sed -r '1! d' file# 删掉 正则 不 匹配的行
sed -r '/正则表达式/! d' file
- e 多次编辑,
正常sed 只能应用依次编辑
类似
sed -r '1 d' file
如果想一个命令执行多个独立的编辑操作,可以使用-e
# 删除第一行 & 第二行的aa换成bb
sed -r -e '1 d' -e '2 s/aa/bb/' file
当然,也可以使用分号(;)隔离多个独立的 查找应用 命令
# 删除第一行 & 第二行的aa换成bb
sed -r '1 d;2 s/aa/bb/' file
如果是对同一行执行多个操作可以使用分号(;)隔离多个sed 应用命令
# 第二行的 aa换成bb & 第二行的 cc换成dd
sed -r '2 {s/aa/bb/;s/cc/dd/}' file