Sed 基本语法
Sed - 理解基本语法和选项
Section titled “Sed - 理解基本语法和选项”本章介绍调用 Sed 的基本命令行语法及其常用选项。Sed 主要可以通过两种方式调用:
1. `sed [options] 'command(s)' [file(s)]`2. `sed [options] -f scriptfile [file(s)]`第一种方式允许您直接在命令行上指定 Sed 命令,用单引号括起来(以防止 shell 展开)。第二种方式从指定的 scriptfile 读取 Sed 命令。您可以组合使用这些方式,如果没有给出文件,Sed 会从标准输入读取。
指定多个命令
Section titled “指定多个命令”您可以通过几种方式提供多个 Sed 命令:
- 使用多个
-e选项:sed -e 'command1' -e 'command2' ... files - 在一个脚本中用分号分隔命令:
sed 'command1; command2; ...' files(注意:一些命令(例如带有标签的命令)可能需要用换行符而不是分号分隔)。 - 将命令放在脚本文件中的单独行上,并使用
-f scriptfile。
让我们准备一个示例文件 books.txt:
[user]$ cat books.txt1) A Storm of Swords, George R. R. Martin, 12162) The Two Towers, J. R. R. Tolkien, 3523) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4325) The Pilgrimage, Paulo Coelho, 2886) A Game of Thrones, George R. R. Martin, 864示例:使用多个 -e 选项删除第 1、2 和 5 行。d 命令用于删除行。
[user]$ sed -e '1d' -e '2d' -e '5d' books.txt输出:
3) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4326) A Game of Thrones, George R. R. Martin, 864示例:使用脚本文件进行相同的操作。
[user]$ echo -e "1d\n2d\n5d" > commands.sed[user]$ cat commands.sedcommands.sed 的内容:
1d2d5d现在,使用此脚本文件执行 Sed:
[user]$ sed -f commands.sed books.txt输出(与上面相同):
3) The Alchemist, Paulo Coelho, 1974) The Fellowship of the Ring, J. R. R. Tolkien, 4326) A Game of Thrones, George R. R. Martin, 864标准 POSIX 选项
Section titled “标准 POSIX 选项”这些选项通常在大多数 Sed 实现中可用。
-n或--quiet或--silent: 抑制模式空间的自动打印。默认情况下,Sed 在处理完每行后会打印该行。使用-n时,只有显式命令(例如,p命令)才会打印行。
使用 -n 的示例 (准备 quote.txt):
[user]$ echo -e "First line.\nSecond line." > quote.txt
[user]$ sed -n 'p' quote.txt # With -n, 'p' is needed to print输出:
First line.Second line.[user]$ sed 'p' quote.txt # Without -n, 'p' causes double printing输出(每行打印两次:一次是默认行为,一次是 p 命令):
First line.First line.Second line.Second line.-e script: 将script添加到要运行的命令集中。对于多个命令或包含 shell 元字符的脚本非常有用。
[user]$ sed -e 's/First/Initial/' -e 's/Second/Final/' quote.txt输出:
Initial line.Final line.-f script-file: 将script-file的内容添加到命令中。
[user]$ echo 's/line/LNE/g' > transform.sed[user]$ sed -f transform.sed quote.txt输出:
First LNE.Second LNE.GNU Sed 特有选项
Section titled “GNU Sed 特有选项”这些选项是 GNU Sed 特有的,在其他 Sed 版本(例如,在 macOS 上,通常使用 BSD Sed)中可能不可用或工作方式不同。
--expression=script:-e script的长形式。--file=script-file:-f script-file的长形式。--follow-symlinks: 使用-i(原地编辑) 时,此选项使 Sed 遵循符号链接并编辑目标文件。默认情况下,-i可能会创建一个新文件并替换符号链接。-i[SUFFIX]或--in-place[=SUFFIX]: 原地编辑文件。这是一个非常强大且潜在具有破坏性的选项。请谨慎使用! 如果提供了SUFFIX(例如-i.bak),则会创建原始文件的备份,并带有该后缀。如果没有提供SUFFIX,则直接覆盖原始文件。示例:sed -i.bak 's/old/new/' file.txt修改file.txt并创建file.txt.bak。-l N或--line-length=N: 为l(列出无歧义字符) 命令指定所需的行包装长度。默认通常是 70。N=0表示不进行包装。--posix: 禁用所有 GNU 扩展。这使得 GNU Sed 的行为更像标准的 POSIX Sed,对于编写可移植脚本很有用。-r或--regexp-extended: 使用扩展正则表达式 (ERE) 而不是基本正则表达式 (BRE)。这使得许多 regex 模式更简洁,因为像?、+、{}、|、()这样的特殊字符不需要转义。(注意:POSIX 标准中 ERE 通常是-E,GNU Sed 也支持)例如:sed -r 's/(word1|word2)/replacement/'对比 BRE 的sed 's/\(word1\|word2\)/replacement/'。-s或--separate: 默认情况下,Sed 将所有输入文件视为一个连续的流。使用-s时,文件被单独处理。这会影响行号和地址范围,例如$(最后一行),它们将分别应用于每个文件。-u或--unbuffered: 从输入文件中加载最小量的数据,并更频繁地刷新输出缓冲区。这在处理像tail -f这样的命令输出时非常有用,确保 Sed 能够及时处理和输出到达的数据,而不会有长时间的延迟。-z或--null-data: 使用 NUL 字符 (\0) 而不是换行符来分隔行。这对于处理find ... -print0生成的文件名非常有用,因为它可以安全地处理包含空格、换行符或其他特殊字符的文件名。
选择合适的选项:
为了可移植性,请坚持使用 POSIX 选项 (-n、-e、-f) 和 BRE,或显式使用 sed --posix。在保证使用 GNU Sed 的脚本中,为了方便,使用 -r (用于 ERE) 和 -i (用于原地编辑) 非常有用。使用 -i 时务必小心,并考虑进行备份。