使用场景
sed提供了一种免交互的方式修改文件内容。
它是一行一行处理,可以通过正则匹配要修改的部分
基本语法
-
基本语法
sed [-opt] command files(多个文件 空格隔开) -
sed 使用扩展正则,不加r不能完全匹配扩展正则表达式
sed -r “正则匹配数据行/指定行号 sed命令” files -
sed 修改内容写回文件
默认,sed操作完的数据会显示在控制台,而不会回写到文件中; 若要将变更保存到文件可以使用 -i 选项sed -r -i “/正则表达式/或者指定行号 + [{]sed命令[}]” files
sed 命令可以使用 {} 括起来,也可以不写,写了意思更明确。
如果要对选中的行执行多个操作可以使用 分号(;) 隔开 sed命令
sed -r "\regex expression\{s;r}" file
- 行号表示法匹配多行使用逗号分割两个行号($ 表示最后一行)
# 删除 1 到 2 行
sed -r "1,2{d}" file
- sed 命令中引用变量
通常在 单引号’ ’ 内使用sed 命令,但单引号 ’ ’ 会将内部字符强制转义,使其无法引用到变量。
此时需使用 双引号 " " 定义sed命令,但此时有可能引发其他字符需转义,这时需使用反斜杠 \ 单独对字符进行转义。
# 将最后一行替换为 变量abc的值 123
var abc=123
sed -r "\$ c $123" file
实例
命令列表
-
d 删除匹配的行
// 删除正则匹配的行
sed -r “/正则表达式/{d}” file
// 删除指定行
sed -r “行号{d}” file- 按正则表达式删除
sed -r "/regex expression/d" file
- 删除第二行
sed -r "2 {d}" file sed -r "2d" file sed -r "2{d}" file
- 删除 2-5行
sed "2,5 {d}" file sed "2,5{d}" file
- 删除5行到最后一行
sed -r "5,$ {d}" file sed -r "5,${d}" file sed -r "5,$d" file
- 删除最后一行
sed -r "$ {d}" file sed -r "${d}" file sed -r "$d" file
-
s 替换匹配上的字符
sed -r “s/正则查找的内容/要替换的内容/” file
也可以使用 # 分割,当要替换的内容中有/或其他特殊含义字符时可以使用#,或者使用转义
sed -r “s#正则查找的内容#要替换的内容#” file默认,只会替换每一行中的第一个匹配上的字符串;如果要全部替换,需要在最后的 / 后加个g,代表行内匹配上的字符串都替换
# 将含有 abc 的行 的第一个 abc 换成 def sed -r "s/abc/def/" file # 将含有 abc的行 的所有 abc 都换成 def sed -r "s/abc/def/g" file
sed 的 s 命令中,如果要引用查找到的字符串可以使用() + \1 或 &(&获取的是整个查找条件而忽视() ) 获取
和 vim 中 类似。# 匹配abcd ,然后在然后取出abc,再在后面拼接123,最终结果是 abcd 换成 abc123 # ;\1 代表前面第一个()内的内容,依次递增;&取的值是 整个条件命中字符串,而仅仅不是()中的内容 sed -r 's/(abc)d/\1123/' file 结果就是 abc123
s 命令如果要按照行号进行匹配,则需要将行号放到 s前面,一般使用行号,是针对整行进行操作,要么替换整行 要么 在前后追加
# 行首插入 123,有以下三种写法 sed -r '1 s/^/123/' file # ^ 代表行首字符,将^ 替换为123 sed -r '1 s/(.*)/123\1/' file sed -r '1 s/.*/123&/' file # 行尾插入 123,有以下三种写法 sed -r '1 s/$/123/' file # $ 代表行首字符,将$ 替换为123 sed -r '1 s/(.*)/\1123/' file sed -r '1 s/.*/&123/' file # 整行替换 为 123 等同于 c 命令 sed -r '1 s/(.*)/123/' file sed -r '1 s/.*/123/' file
-
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
当然,也可以使用分号(;)隔离多个独立的 查找应用 命令文章来源:https://www.toymoban.com/news/detail-635076.html
# 删除第一行 & 第二行的aa换成bb
sed -r '1 d;2 s/aa/bb/' file
如果是对同一行执行多个操作可以使用分号(;)隔离多个sed 应用命令文章来源地址https://www.toymoban.com/news/detail-635076.html
# 第二行的 aa换成bb & 第二行的 cc换成dd
sed -r '2 {s/aa/bb/;s/cc/dd/}' file
到了这里,关于Shell编程基础(十五)文本三剑客(sed)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!