Sed学习整理

2017-07-07  本文已影响88人  carolwhite

结合自己使用需要,主要根据三十分钟学会SED简化整理所得。

用途

sed是一个文本解析转换工具,主要用于以下用途:


工作流

SED遵循简单的工作流:读取,执行和显示。

注意事项

基础语法

sed [-n] [-e] 'command(s)' files 
sed [-n] -f scriptfile files

第一种方式在命令行中使用单引号指定要执行的命令,第二种方式则指定了包含SED命令的脚本文件。


标准选项

  $ sed '' hello.txt  #创建个hello的txt,''表示没输入任何命令
  hello
  $ sed -n '' hello.txt  
  $ sed -e '' -e 'p' hello.txt
 hello
 hello
  $ echo "p" > commands
  $
  $ sed -n -f commands hello.txt
  hello

行寻址

默认情况下,在SED中使用的命令会作用于文本数据的所有行。如果只想将命令作用于特定的行或者某些行,则需要使用 行寻址 功能。

[address]command   #基本语法

先创建一个文本用于演示.

$ cat demo.txt
1 one
2 two
3 three
4 four
5 five
6 six

1.以数字形式表示的行区间

指定行。

$ sed -n '3p' demo.txt  #p命令是打印出模式空间中的内容
3 three

用逗号确定范围

$ sed -n '2,4p' demo.txt
2 two
3 three
4 four

$符号表示最后一行

$ sed -n '4,$ p' demo.txt
4 four
5 five
6 six

SED还提供了另外两种操作符用于指定地址范围,第一个是加号(+)操作符,它可以与逗号(,)操作符一起使用,例如 M, +n 将会打印出从第M行开始的下n行

$ sed -n '2,+2p' demo.txt
2 two
3 three
4 four

我们还可以使用波浪线操作符()指定地址范围,它使用MN的形式,它告诉SED应该处理M行开始的每N行。例如,50~5匹配行号50,55,60,65等,让我们只输出文件中的奇数行

$ sed -n '1~2p' demo.txt
1 one 
3 three
5 five

注意,如果使用的是Mac系统自带的sed命令,可能不支持~和+操作符。可以使用brew install gnu-sed --with-default-names重新安装GNU-SED。

2.使用文本过滤器
/pattern/command  #一般格式
$ sed -n '/three/ p' demo.txt
3 three

规则与数字表示一样,也可以与数字表示配合使用.

$ sed -n '/one/,/three/ p' demo.txt
1 one
2 two
3 three

$ sed -n '/3/ p' demo.txt
3 three


基本命令

[address1[,address2]]d

address1和address2是开始和截止地址,它们可以是行号或者字符串匹配模式,这两种地址都是可选的。
注意的是,该命令只会移除模式空间中的行,但原始内容不会改变。

$ sed '3,5 d' demo.txt
1 one
2 two
6 six

SED提供了 write 命令用于将模式空间中的内容写入到文件

$ sed -n '2,3 w junk.txt' demo.txt 
$ cat junk.txt
2 two
3 three
[address]a Append text
$ sed '2 a 9 nine' demo.txt
1 one
2 two
9 nine
3 three
4 four
5 five
6 six
$ sed '3,5 c 9 nine' demo.txt
1 one
2 two
9 nine
6 six
[address1[,address2]]s/pattern/replacement/[flags]
$ sed 's/one/first/' demo.txt
1 first
2 two
3 three
4 four
5 five
6 six

在SED中,使用替换命令的时候默认只会对第一个匹配的位置进行替换.
以下有一些参数可供使用。

$ sed -n '/two/ !p' demo.txt
1 one
3 three
4 four
5 five
6 six

保持空间

在处理模式空间中的某些行时,可以用保持空间来临时保存一些行。有5条命令可用来操作保持空间

命令 作用
h 将模式空间复制到保持空间
H 将模式空间附加到保持空间
g 将保持空间复制到模式空间
G 将保持空间附加到模式空间
x 交换模式空间和保持空间的内容
$ sed -n '1!G;h;$p' demo.txt
6 six
5 five
4 four
3 three
2 two
1 one
  1. 1!G 这句的意思是出了第一行之外,处理每一行的时候都将保持空间中的内容追加到模式空间(正序->倒序)
  2. h 将模式空间中的内容复制到保持空间以备下一行匹配的时候追加到下一行的后面
  3. $p 如果匹配到最后一行的话则输出模式空间中的内容
  4. 上述步骤不断重复直到文本结束刚好将文件内容翻转了一次
上一篇下一篇

猜你喜欢

热点阅读