sed的基本语法和选项

看到有时候有些人会sed问各种选项。那今天就列一下:
sed [options]  [script] [inputfile...]
上面的语法中,options代表sed命令的选项,常用的选项如下所列:
-n:取消默认输出。
-e:允许执行多个脚本
-f:从脚本文件中读取命令。
-i:直接修改原始文件。
-l:指定行的长度
-r:在脚本中使用扩展正则表达式
-s:默认情况下,sed将把命令行指定的多个文件名作为一个长的连续的输入流。而GNU sed则允许把他们当做单独的文件,这样的话,正则表达式不进行跨文件匹配。
-u:最低限度的缓存输入与输出。
sed的工作方式:
sed [options] commands inputfile
237

<think>我们正在讨论sed命令中的追加(append)插入(insert)命令的语法。 根据用户的问题,用户想了解sed中追加插入命令的语法。 首先,我们回顾一下sed基本结构: sed命令通常采用以下形式:`sed [options] 'address command [options]' inputfile` 其中,address指定了要操作的行(可以是行号、正则表达式匹配等),command是具体的操作命令。 对于追加(a)插入(i)命令: 1. 追加(a)命令:在指定行之后追加文本。 语法:`sed 'address a\ text_to_append' filename` 注意:在a命令后面需要紧跟一个反斜杠`\`,然后是要追加的文本。如果文本有多行,则每行末尾用反斜杠续行(除了最后一行)。 2. 插入(i)命令:在指定行之前插入文本。 语法:`sed 'address i\ text_to_insert' filename` 同样,i命令后面也需要紧跟反斜杠`\`,然后是要插入的文本。 注意:在GNU sed中,也可以不用反斜杠,而使用分号来分隔命令,但追加插入命令通常需要换行,所以通常使用反斜杠后换行来输入多行文本。不过,在单行文本的情况下,我们可以在一行内完成。 示例: 1. 追加:在文件第2行之后追加一行“This is appended text”。 `sed '2a\This is appended text' filename` 2. 插入:在文件第2行之前插入一行“This is inserted text”。 `sed '2i\This is inserted text' filename` 也可以使用正则表达式匹配行: 例如,在匹配到“hello”的行之后追加一行“world”: `sed '/hello/a\world' filename` 另外,追加插入多行文本: 在追加或插入多行文本时,我们可以在反斜杠后面换行,并在每一行(除了最后一行)的末尾加上反斜杠表示续行。 例如,在第3行之后追加两行: `sed '3a\line1\ line2' filename` 注意:在命令行中,如果使用单引号,那么换行需要按照shell的要求进行。在脚本中,我们可以这样写。 另外,在sed脚本文件中,我们可以直接换行。 引用[1][2]中提到了其他命令(如find)的用法,但用户的问题是关于sed的,所以主要关注sed。 根据用户要求,我们生成相关问题: §§相关问题§§ 1. sed中的追加插入命令与替换命令有何不同? 2. 如何在sed中同时使用多个命令(包括追加插入)? 3. 在sed中如何对匹配多个模式的行进行追加或插入操作?</think>### sed 中的追加与插入命令语法 在 `sed` 流编辑器中,**追加(a)** **插入(i)** 命令用于在指定位置添加新内容,语法结构如下: #### 1. 追加命令 `a`(在指定行**之后**添加内容) ```sed [地址]a\新文本内容 ``` - **地址**:行号(如 `2`)或正则表达式(如 `/pattern/`) - **`a\`**:固定语法,表示追加操作 - **新文本**:要添加的内容(支持多行) **示例**: ```bash # 在第3行后追加内容 sed '3a\这是追加的行' file.txt # 在匹配 "END" 的行后追加多行内容 sed '/END/a\第一行\第二行' file.txt ``` #### 2. 插入命令 `i`(在指定行**之前**添加内容) ```sed [地址]i\新文本内容 ``` - **地址**:行号或正则表达式 - **`i\`**:固定语法,表示插入操作 **示例**: ```bash # 在第1行前插入标题 sed '1i\=== 文件头 ===' file.txt # 在空行前插入分隔符 sed '/^$/i\----' file.txt ``` #### 关键特性: 1. **地址灵活性**: - 单行:`2a\...`(第2行后) - 正则:`/^#/i\...`(以`#`开头的行前) - 范围:`2,5a\...`(2-5行每行后) - 末行:`$a\...`(文件末尾) 2. **多行内容**: 用反斜杠 `\` 连接多行: ```bash sed '3i\第一行\第二行\第三行' file.txt ``` 3. **修改源文件**: 添加 `-i` 选项直接修改文件: ```bash sed -i '2a\新内容' file.txt # GNU sed sed -i '' '2a\新内容' file.txt # BSD sed (macOS) ``` 4. **特殊字符处理**: 包含斜杠时使用其他分隔符: ```bash sed '\|/path|i\新路径' file.txt ``` #### 工作流程示例: 假设 `file.txt` 内容为: ``` Line 1 Line 2 Line 3 ``` 执行: ```bash sed '2a\Inserted after line 2' file.txt ``` 输出: ``` Line 1 Line 2 Inserted after line 2 ← 追加在第2行后 Line 3 ``` > **注意**:`a` `i` 是立即执行的命令,与 `c`(替换整行)不同[^1]。在脚本中使用时,建议先用备份文件测试。 --- ### 相关问题 1. `sed` 的追加/插入命令与 `c`(替换)命令有何本质区别? 2. 如何在 `sed` 中实现「仅在匹配特定模式的行后追加多行文本」? 3. 当需要插入包含特殊字符(如 `/`、`\`)的内容时,有哪些转义技巧? 4. `sed` 的 `-i` 选项在不同操作系统(Linux/macOS)中的行为差异是什么? [^1]: 模式转换 命令模式–>插入模式 i insert,在光标所在处输入I 在当前光标所在行的行首输入a append,在光标所在处后面输入A 在当前光标所在行的行尾输入o 在当前光标所在行的下方打开一个新行O 在当前光标所在行的上方打开一个新行 [^2]: -ok COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令(交互式的,要求用户确认) {}:用于查找到文件名称自身。 find ./ -cmin -5 -exec mv {} {}.new \; [^3]: 第二周总结。将 /home 里面的文件打包,但打包的数据不是记录到文件,而是传送到 stdout,经过管道后,将 tar -cvf - /home 传送给后面的 tar -xvf - , 后面的这个 - 则是取前一个命令的 stdout, 因此,就不需要使用临时file了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值