Linux命令学习sed

  • sed全名叫stream editor,流编辑器,用程序的方式来编辑文本,基本都是使用正则表达式
  • 用s命令替换,此命令替换text文本中的my为Dai Shipeng's,/g表示全体
sed "s/my/Dai Shipeng's/g" text
  • 如果需要直接修改文件内容,使用-i参数
sed -i "s/my/Dai Shipeng's/g" text
  • 在每一行最前面加上#,在每一行最后加上---
sed 's/^/#/g' text
sed ''s/$/---/g' text
  • 表示一行的开头,$表示一行的结尾,<表示词首,>表示词尾,[a]表示非a字符
# 如果要去掉html文本中的tags
sed 's/<.*>//g' html.txt  # 错误
sed 's/<[^>]*>//g' html.txt
  • 选择性替换某些行的文本
sed "3s/my/your/g" pets.txt  # 替换第三行文本
sed "3,6s/my/your/g" pets.txt # 替换第三行到第六行文本
sed "6,$s/my/your/g" pets.txt # 替换第六行即之后文本
  • 选择性替换每一行某些匹配项的文本
sed 's/s/S/1' my.txt  # 替换每一行第一个s匹配
sed 's/s/S/3g' my.txt # 替换
  • 如果需要同时替换多个模式的,sed '1,3s/my/your/g; 3,$s/This/That/g' my.txt;也可以使用-e参数sed -e '1,3s/my/your/g' -e '3,$s/This/That/g' my.txt

  • &可以作为被匹配的变量,比如:sed 's/my/[&]/g' my.txt,在被匹配的my左右加上[]

  • 圆括号括起来的正则表达式所匹配的字符串可以当作变量使用,sed中使用\1,\2表示变量

$ sed 's/This is my \([^,&]*\),.*is \(.*\)/\1:\2/g' my.txt
cat:betty
dog:frank
fish:george
goat:adam
  • N命令:把下一行的内容纳入当前缓存区做匹配(把两行当作一行做匹配)
$ sed 'N;s/my/your/' pets.txt
This is your cat
  my cat's name is betty
This is your dog
  my dog's name is frank
This is your fish
  my fish's name is george
This is your goat
  my goat's name is adam
  • a命令是append,i命令是insert,都是用来添加行的
# 其中的1i表明,其要在第1行前插入一行(insert)
sed "1 i This is my monkey, my monkey's name is wukong" my.txt

# 其中的$ a表明,其要在最后一行后追加一行(append)
sed "$ a This is my monkey, my monkey's name is wukong" my.txt

# 注意其中的/fish/a,这意思是匹配到/fish/后就追加一行
sed "/fish/a This is my monkey, my monkey's name is wukong" my.txt
  • c命令是替换行
# 替换第二行整行
sed "2 c This is my monkey, my monkey's name is wukong" my.txt
# 替换匹配到fish的行
sed "/fish/c This is my monkey, my monkey's name is wukong" my.txt
  • d命令是删除匹配行
# 删除匹配到fish的行
sed '/fish/d' my.txt
# 删除第二行
sed '2d' my.txt
# 删除第三行即之后的行
sed '3,$d' my.txt
  • p命令,可以当作grep命令
# 删除匹配到fish的行,其他行也会输出,使用参数-n可以只输出匹配行
sed '/fish/p' my.txt
sed -n '/fish/p' my.txt
  • 基本知识点
  • -n参数的作用,用伪代码解释如下:
foreach line in file {
    //放入把行Pattern_Space
    Pattern_Space <= line;
    
    // 对每个pattern space执行sed命令
    Pattern_Space <= EXEC(sed_cmd, Pattern_Space);

    // 如果没有指定 -n 则输出处理后的Pattern_Space
    if (sed option hasn't "-n")  {
       print Pattern_Space
    }
}
  • 关于匹配行的模式,可以是行数字,也可以是模式(正则)
# /dog/表示匹配上dog的行,其中的+3表示后面连续3行
$ sed '/dog/,+3s/^/# /g' pets.txt
This is my cat
  my cat's name is betty
# This is my dog
#   my dog's name is frank
# This is my fish
#   my fish's name is george
This is my goat
  my goat's name is adam
  • cmd命令可以多个,可以用分号分开,也可以用大括号括起来作为嵌套命令
$ cat pets.txt
This is my cat
  my cat's name is betty
This is my dog
  my dog's name is frank
This is my fish
  my fish's name is george
This is my goat
  my goat's name is adam

# 对3行到第6行,执行命令/This/d
$ sed '3,6 {/This/d}' pets.txt
This is my cat
  my cat's name is betty
  my dog's name is frank
  my fish's name is george
This is my goat
  my goat's name is adam

# 对3行到第6行,匹配/This/成功后,再匹配/fish/,成功后执行d命令
$ sed '3,6 {/This/{/fish/d}}' pets.txt
This is my cat
  my cat's name is betty
This is my dog
  my dog's name is frank
  my fish's name is george
This is my goat
  my goat's name is adam

# 从第一行到最后一行,如果匹配到This,则删除之;如果前面有空格,则去除空格
$ sed '1,${/This/d;s/^ *//g}' pets.txt
my cat's name is betty
my dog's name is frank
my fish's name is george
my goat's name is adam 
  • sed模式空间(pattern space)即为处理文件中一行内容的一个临时缓冲区。处理完一行之后会把模式空间中的内容打印到标准输出,然后自动清空缓存
  • sed保持空间(hold space)是sed的另一个缓冲区,不会自动清空,但也不会主动把此缓冲区的内容打印到标准输出
  • g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
  • G: 将hold space中的内容append到pattern space\n后
  • h: 将pattern space中的内容拷贝到hold space中,原来hold space里的内容清除
  • H: 将pattern space中的内容append到hold space\n后
  • x: 交换pattern space和hold space的内容
    示例如下:
$ cat t.txt
one
two
three
$ sed 'H;g' t.txt
one

one
two

one
two
three

$ sed '1!G;h;$!d' t.txt
three
two
one
posted @ 2022-03-25 16:33  無花無酒鋤作田  阅读(54)  评论(0编辑  收藏  举报