文本处理三剑客之sed

sed的工作模式

  • 基础介绍

    • sed(Stream Editor),流编辑器。对标准输出或文件逐行进行处理
  • 语法格式

    • 第一种形式:stdout | [option] "pattern command"
    • 第二种形式:sed [option] "pattern command" file
  • sed的处理过程

    对每一行进行模式匹配,如果成功,就使用命令对这一行进行处理;如果没有pattern只有commond,则对所有人都进行处理。


sed的选项

选项 含义
-n 只打印模式匹配的行(静默模式)
-e 直接在命令行进行sed编辑
-f 编辑动作保存在文件中,指定文件执行
-r 支持扩展正则表达式
-i 直接修改文件内容
  • 例1:sed -n '/java/p' sed.txt 将文本中包含java的行进行输出
  • 例2:sed -n -e '/java/p' -e '/python/p' sed.txt 将文本中包含java的行输出,包含pyhton的行也输出
  • 例3:sed -n -f edit.sed sed.txt **将sed的命令保存到文件中,使用-f指定文件进行执行 **
  • 例4:sed -n -r '/pyhton|java/p' 将文本中包含java的行输出,包含pyhton的行也输出
  • 例5:sed -n -i 's/love/like/g' 对文本中所有的行将love替换成like,并直接修改源文件

sed中的pattern详解

匹配模式 含义
10command 匹配到第10行
10,20command 匹配从第10行开始,到20行结束
3,8!command 匹配除3~8之外的所有行
10,+5commond 匹配从第10行开始,到第16行结束
/pattern1/commond 匹配到pattern1的行
/pattern1/,/pattern2/commond 匹配到pattern1的行开始,匹配到pattern2的行结束
10,/pattern1/commond 匹配从第10行开始,到匹配pattern1的行结束
pattern1/,10commond 匹配到pattern1的行开始,到第10行匹配结束
  • LineNumber --------------------直接指定行号

    sed -n '17p' file 打印文件的第17行

  • StartLine,EndLine --------------------指定起始行号和终止行号

    sed -n '10,20p' file 打印file文件的10到20行

  • StartLine,+N --------------------指定起始行号,然后后面N行

    sed -n '10,+5p' file 打印file文件中从第10行开始,往后面加5行

  • /pattern1/

    sed -n '/^root/p' file 打印file文件中以root开头的行

  • /pattern1/,/pattern2/

    ``


sed中的编辑命令详解

类别 编辑命令 含义
查询 p 打印
增加 a 行后追加
i 行前追加
r 外部文件读入,行后追加
w 匹配行写入外部文件
删除 d 删除
修改 s/old/new 将行内第一个old提华为new
s/old/new/g 将行内全部的old替换为new
s/old/new/2g 从第二个开始,把这一行内的所有的old替换为new
s/old/new/2 只把这一行的第二个old替换为new
s/old/new/ig 将行内全部的old替换为new,忽略大小写
y/原子符序列/新字符序列 j将原字符序列中每一个字符替换为新字符序列中的对应字符
h 将当前模式空间中的内容覆盖至保持空间
H 将当前模式空间中的内容追加至保持空间
g 将当前保持空间中内容覆盖至模式空间
G 将当前保持空间中的内容追加至模式空间
x 将当前保持空间和模式空间内容互换
  • 例1:sed -i '/\/bin\/bash/a This is an user who can login in system!' passwd
  • 例2:sed -i '/\/bin\/bash/i This is an user who can login in system!' passwd
  • 例3:sed -i '/root/r /tmp/test.txt' passwd
  • 例4:sed -i '/\/bin\/bash/w /tmp/login.txt' passwd
  • 例5:sed -i 's/\/bin\/bash/\/BIN\/BASH/g' (将每一行内的\bin\bash替换为\BIN\BASH)

反向引用

&\1 引用模式匹配到的整个串
sed 's/1..e/&r/g' file 在file中搜寻以1开头,然后根两个任意字符,以e结尾的字符串
sed 's/\(1..e\)/\1r/g file' 和上一个一样的功能,但是使用\1代表搜寻到的字符串

上面的两种方式实现了一样的功能,分别使用&\1引用前面匹配到的整个字符串,两者的区别在于&只能表示匹配到的完整字符串,只能引用整个字符串;而\1可以使用()对匹配到的字符串进行部分引用。例如:如果我们仅想要替换匹配到的字符串的一部分,name必须使用\1这种方式,不能使用&。

sed "s/1\(..e\)/L\1/g" file 将file中以1开头,紧接着跟两个字符串,以e结尾的字符串。将找到的字符串中开头的1后面紧接一个L。


sed中引用变量时的注意事项

  1. 匹配模式中存在变量,则建议使用双引号。

    #!/bash/bin
    old_str=hadoop
    new_str=HADOOP
    
    sed -i "s/$old_str/$new_str/g"
    
  2. sed中需要引入自定义变量时,如果外面使用单引号,则自定义变量也必须使用单引号

    #!/bash/bin
    old_str=hadoop
    new_str=HADOOP
    
    sed -i 's/'$old_str'/'$new_str'/g'
    

你可能感兴趣的:(Linux基础)