Shell编程基础(十五)文本三剑客(sed)

使用场景

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

当然,也可以使用分号(;)隔离多个独立的 查找应用 命令

# 删除第一行 & 第二行的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值