在sed所有的例子中,我们将使用下面的这个文件employee.txt。
请先创建好这个文本文件,然后练习本书的命令。
$ vi employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Manager
上述雇员表中每行都包括如下字段:
员工ID
员工姓名
标题
sed属于流编辑器,它在操作、过滤和替换文本方面是一个非常强大的工具。sed可以从文件或者管道读取内容。
对于初学者来说,sed脚本可能看起来难以理解。不过您一旦理解了sed命令的细节,您就可以快速的写一个sed脚本来解决很多复杂的文本问题。
在这本书中,我已经解释了sed所有的命令,并提供了易于理解的例子。
1。sed命令语法
本节的目标是为了让您更熟悉sed语法和命令结构。这并不是说要解释每个sed命令,这些命令将会在后面详细讲解。
sed的基本语法:
sed [options] { sed-commands } { input-file }
sed每次从{input-file}读取一行,然后在这行上执行{ sed-commands }。
sed首先读取{ input-file }的第一行,并对第一行执行{ sed-commands } 。然后读取{ input-file }的第二行并对第二行执行{ sed-commands }。 以此类推,直到{ input-file }最后一行。
有几个可选的选项,在sed用法中用 [options]表示。
下面的例子演示了sed的基本用法。这简单的sed例子用来显示/etc/ passwd中所有的行。
sed -n 'p' /etc/passwd
这里的重点是{ sed-commands },它可以是一个单一的sed命令或多个sed命令。您也可以把多个sed命令在一个文件中,然后用-f选项来调用这个sed脚本,如下所示。
使用文件的用法:
sed [options] -f {sed-commands-in-a-file}{input-file}
下面的例子演示了这个用法。 这个例子用来显示/etc/passwd中开头是root和开头是nobody的行。
$ vi test-script.sed
/^root/ p
/^nobody/ p
$ sed -n -f test-script.sed /etc/passwd
当执行多个sed命令时,也可以直接在命令行中用-e指定,如下所示。
使用-e的用法:
sed [options] -e {sed-command-1} -e{sed-command-2} {input-file}
下面的例子演示了这个用法。 这个例子用来显示/etc/passwd中开头是root和开头是nobody的行。
sed -n -e '/^root/ p' -e '/^nobody/ p' /etc/passwd
如果在命令行中用-e指定了很多命令的话,您可以使用\分成多行来写,如下所示。
sed -n \
-e '/^root/ p' \
-e '/^nobody/ p' \
/etc/passwd
您也可以把要执行的多个命令放在{}里:
使用{}的用法:
sed [options] '{
sed-command-1
sed-command-2
}' input-file
下面的例子演示了这个用法。也是显示/etc/passwd中以root开头和以nobody开头的行。
sed -n '{
/^root/ p
/^nobody/ p
}' /etc/passwd
注:sed不会修改原文件,它总是输出到标准输出(stdout)。 如果您想保存,您应该使用 >filename.txt 把输出重定向到文件中。