文本处理-sed

vim 文本编辑器

sed awk 行编辑器


sed 的基本工作方式是:
• 将文件以行为单位读取到内存(模式空间)
• 使用sed的每个脚本对该行进行操作
• 处理完成后输出该行


sed 的替换命令 s:
# 将单行的old字符串替换成new字符串,仅替换第一次
• sed ’s/old/new/’ filename
# 多个替换命令(-e),后面可跟多个待处理的文件
• sed -e ’s/old/new/’ -e ’s/old/new/’ filename  …
# 等同于上面的多个-e参数的写法
sed ‘s/a/aa/;s/b/bb/‘ filename
# 将替换后的内容写回原文件(-i)
• sed -i ’s/old/new/’ ’s/old/new/’ filename  …
# 将替换的内容输出到其他文件
sed ‘s/a/aa/‘ > test-sed.txt
# 支持扩展正则表达式
• sed -r ’s/扩展正则表达式/new/’ filename

# 元字符替换
# 在/etc/passwd文件中查找带有root的行,将以root开头的内容替换为空(即 删除)
grep root /etc/passwd | sed ‘s/^root//‘

# 扩展元字符
# 将 ab abb abb... 替换成 !
sed -r ‘s/ab+/!/‘ testfile
# 将testfile中的aa或bb替换成 !    sed 通过圆括号分组
sed -r ‘s/(aa)|(bb)/!/‘ testfile


# 匹配a.*b格式的字符串后,将匹配到的字符串 输出两遍,并在其中加上:
sed -r ‘s/(a.*b)/\1:\1/‘ testfile


s/old/new/g

• g 为全局替换,用于替换所有出现的次数
• / 如果和正则匹配的内容冲突可以使用其他符号,如:
     @

### 全局替换



# 标志位
s/old/new/标志位

• 数字,第几次出现才进行替换
    # 仅匹配第二次出现的sbin
    [ ~]# head -5 /etc/passwd | sed ‘s/sbin/!!!/2‘

• g,每次出现都进行替换
# 将出现的所有sbin 替换成 !!!
    [ ~]# head -5 /etc/passwd | sed ‘s/sbin/!!!/g‘
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/!!!/nologin
    daemon:x:2:2:daemon:/!!!:/!!!/nologin
    adm:x:3:4:adm:/var/adm:/!!!/nologin
    lp:x:4:7:lp:/var/spool/lpd:/!!!/nologin

• p 打印模式空间的内容(sed具有默认输出的,看起来被匹配到的内容被输出两次)

# 阻止sed的默认输出,只输出替换成功的行 -n 参数控制
• sed -n ‘script’ filename

• w file 将模式空间的内容写入到文件
[ ~]# head -5 /etc/passwd | sed -n ‘s/root/ROOT/w /tmp/sed-test.txt‘
[ ~]# cat /tmp/sed-test.txt
ROOT:x:0:0:root:/root:/bin/bash

相关推荐