活动介绍

sed命令删除关键字所在行,且不输出其余行。关键字有很多,希望可以一一删除

时间: 2025-07-26 13:24:22 浏览: 35
<think>我们有一个需求:使用sed命令删除包含多个关键字的行,并且不输出其他行(即只输出不包含这些关键字的行)。注意,sed默认会输出所有行,除非我们使用`-n`选项并配合`p`命令来打印特定行。但这里我们是要删除包含某些关键字的行,所以实际是保留不包含这些关键字的行。我们可以使用多个`-e`选项来指定多个模式,或者使用分号分隔多个命令。但是,我们也可以在一个命令中使用多个条件。然而,注意需求是“包含多个关键字”,即一行中同时包含这些关键字才删除?还是包含任意一个关键字就删除?根据问题描述,用户说“删除包含多个关键字的行”,这里我们理解为删除包含所有指定关键字的行(即同时包含),还是包含至少一个?通常,如果是要删除包含任意一个关键字的行,我们可以使用多个模式,用`-e`指定多个删除命令。但是,如果是要同时包含多个关键字才删除,则需要使用一个匹配多个关键字的模式。但是问题中并没有明确是“同时包含”还是“包含任意一个”。我们再看用户的问题:“删除包含多个关键字的行”,这通常可以理解为删除那些包含所有指定关键字的行(即同时包含)。但是,用户也可能是指删除包含至少一个关键字的行?我们需要澄清。然而,用户最后的描述是“我想使用sed命令删除包含多个关键字的行,并且不输出其他行”,这里的关键词是“多个关键字”,但并没有明确逻辑关系。在自然语言中,可能有歧义。不过,在文本处理中,常见的需求有两种:1.删除包含任意一个关键字的行(即“或”关系)2.删除包含所有关键字的行(即“与”关系)由于问题没有明确,我们可以考虑两种可能。但根据用户引用的参考信息[^3],他之前遇到了sed命令在不同系统上的差异,所以我们也要注意命令的可移植性。我们先假设用户想要删除包含任意一个关键字的行(即“或”关系)。这种情况下,我们可以使用多个`-e`选项,每个选项对应一个关键字,使用`/pattern/d`命令。例如,删除包含"keyword1"或"keyword2"的行:sed -e '/keyword1/d'-e'/keyword2/d' inputfile或者写在一起:sed '/keyword1/d;/keyword2/d' inputfile但是,如果用户想要删除同时包含所有关键字的行(即“与”关系),那么我们需要一个能匹配多个关键字的正则表达式。但是,正则表达式本身是匹配字符串的,一行中同时包含多个关键字,我们可以用多个正则表达式条件组合,但sed本身不支持“与”逻辑,我们可以通过嵌套地址范围来实现,但更简单的方法是使用多个条件连续判断。一种方法是:我们匹配包含第一个关键字的行,然后在这些行中检查是否包含第二个关键字,如果也包含,则删除。但是,这需要分支命令,使用sed的`b`命令和标签,比较复杂。另一种方法是使用`/pattern1/`匹配到包含第一个关键字的行,然后在这些行中执行命令:检查是否包含第二个关键字,如果包含则删除。我们可以这样写:sed '/keyword1/{/keyword2/d;}'inputfile但是,如果关键字有多个(比如3个),我们可以:sed'/keyword1/{/keyword2/{/keyword3/d;} }' inputfile但是,这样的嵌套对于多个关键字来说可读性差。或者,我们可以使用一个正则表达式来匹配同时包含多个关键字的行,但这实际上很难,因为关键字出现的顺序不确定。我们可以使用:/keyword1.*keyword2\|keyword2.*keyword1/但这样写对于两个关键字还可以,三个关键字就会非常复杂(需要6种排列组合)。因此,对于“与”关系,我们可能需要使用上面提到的嵌套方法,或者使用更高级的工具(如awk)。由于用户要求使用sed,并且没有明确是“或”还是“与”,我们可能需要根据常见情况假设。通常,删除包含任意一个关键字的行更常见。但是,用户说的是“多个关键字”,所以也可能是“与”关系。我们再看用户的问题:“sedcommandto deletelines containingmultiple keywords”,这里“containing multiplekeywords”可以理解为包含多个关键字(即至少两个),但也可以是包含指定的多个关键字(即全部)。这仍然有歧义。为了安全起见,我们可以提供两种方案,并解释。但是,用户还要求“不输出其他行”,即只保留不删除的行。注意,sed默认会输出所有未被删除的行。我们使用`d`命令删除的行将不会被输出,而其他行会被输出。另外,用户还要求“不输出其他行”,这其实和默认行为一致,因为被删除的行不会输出,而保留的行会输出。但注意,如果使用`-n`选项,则sed不会输出任何内容,除非显式使用`p`命令。所以,我们这里不使用`-n`,而是使用`d`命令来删除不需要的行,然后让其他行正常输出。因此,对于“或”关系(删除包含任意一个关键字的行):sed-e'/keyword1/d' -e '/keyword2/d'...inputfile对于“与”关系(删除同时包含所有关键字的行):如果只有两个关键字,我们可以:sed '/keyword1.*keyword2/d; /keyword2.*keyword1/d' inputfile但这样会漏掉一行中关键字1和关键字2之间有换行符的情况(但sed是按行处理,所以没问题),但是这样写对于两个关键字是可行的,因为我们要匹配两个关键字在同一行,无论顺序。另一种更通用的方法是使用`/keyword1/`和`/keyword2/`同时存在,我们可以写:sed -e '/keyword1/!d' -e '/keyword2/d'但这样是不对的,因为第一个命令会删除不包含keyword1的行,然后对剩下的行(包含keyword1)执行第二个命令,删除其中包含keyword2的行?不对,这样最终输出的是包含keyword1但不包含keyword2的行,并不是我们想要的(我们想要的是删除同时包含两个关键字的行,那么应该保留不同时包含的)。所以,我们可以这样写(对于两个关键字):sed'/keyword1/{/keyword2/d; }' inputfile这个命令的意思是:对于包含keyword1的行,检查是否包含keyword2,如果包含则删除(即不输出)。对于不包含keyword1的行,不会被删除(正常输出)。对于包含keyword1但不包含keyword2的行,也不会被删除(正常输出)。这样,我们就删除了同时包含两个关键字的行。但是,这个命令只处理了两个关键字。对于多个关键字(比如三个),我们可以:sed '/keyword1/{ /keyword2/{ /keyword3/d;} }' inputfile但是,这个嵌套只会在同时包含keyword1和keyword2和keyword3的时候才删除。注意,这个命令不会删除只包含keyword1和keyword2但不包含keyword3的行。所以,这符合“同时包含三个关键字”才删除。但是,如果用户想要删除包含至少两个关键字(任意两个)的行,那又不同。所以,我们需要用户明确需求。鉴于用户没有明确,我们可以先提供两种常见情况的解决方案,并说明。另外,用户提到“不输出其他行”,但我们的命令默认就会输出没有被删除的行,所以不需要特别处理。但是,用户引用了参考信息[^3],其中提到了mac osx和centos下sed的差异,特别是`-i`选项。但我们的命令中没有使用`-i`(因为我们只是删除行并输出到标准输出,不修改原文件)。所以,我们不需要使用`-i`。因此,我们给出以下两种方案:情况1:删除包含任意一个关键字(或关系)的行:sed -e '/keyword1/d'-e'/keyword2/d' -e '/keyword3/d'...inputfile情况2:删除同时包含所有关键字(与关系)的行(以三个关键字为例):sed-e'/keyword1/{/keyword2/{/keyword3/d; }}'inputfile但是,情况2的命令中,如果一行包含keyword1和keyword2但不包含keyword3,则不会被删除。这符合要求。但是,情况2的命令有一个问题:它只会删除那些在包含keyword1的前提下又包含keyword2,并且在包含keyword2的前提下又包含keyword3的行。也就是说,它要求关键字按顺序嵌套匹配?实际上不是,因为`/keyword1/`匹配后,会进入大括号内的命令,然后检查`/keyword2/`,如果匹配,再检查`/keyword3/`,如果匹配则删除。注意,这里并没有要求关键字的出现顺序,只要一行中有这些关键字即可,因为正则表达式`/pattern/`是匹配整行的。所以,这个命令是可行的。但是,如果关键字很多,命令会很长,而且嵌套层次多,可能难以阅读。另外,注意:在情况2中,我们只删除了同时包含三个关键字的行,那么同时包含两个关键字的行(比如包含keyword1和keyword2,但不包含keyword3)不会被删除。这符合“同时包含所有”的定义。但是,用户可能希望删除包含至少两个关键字(即任意两个)的行?这个需求又不同。我们这里不展开,因为用户没有明确。因此,我们回答用户时,需要询问具体需求,或者提供两种常见需求的解决方案。由于用户要求生成相关问题,我们可以生成一些问题来帮助用户澄清需求。但是,根据问题,我们也可以提供一种更通用的方法,即使用多个`-e`选项来构建条件删除,但需要用户自己根据逻辑关系组合。另外,注意:在sed中,如果一行同时匹配多个条件,那么命令的执行顺序很重要。例如,在情况1中,如果一行同时包含keyword1和keyword2,那么第一个`-e`选项会删除这一行(然后后续命令不再执行,因为行已经被删除了)。所以,情况1的命令是安全的。最后,我们给出示例命令,并说明。考虑到用户可能是在macosx或Linux上使用,我们避免使用GNU sed特有的选项(如`-r`),使用基本正则表达式。因此,我们这样回答:要使用sed命令删除包含多个关键字的行,具体命令取决于您想要删除的是包含任意一个关键字的行(逻辑或)还是同时包含所有关键字的行(逻辑与)。以下是两种常见情况的解决方案: ###情况1:删除包含任意一个关键字的行(逻辑或)sed-e'/关键字1/d' -e '/关键字2/d'-e'/关键字3/d'文件名此命令会删除包含关键字1、关键字2或关键字3中任意一个的行,并输出剩余的行。###情况2:删除同时包含所有关键字的行(逻辑与)sed-e'/关键字1/{/关键字2/{/关键字3/d; }}'文件名此命令会删除同时包含关键字1、关键字2和关键字3的行(即必须都包含),并输出剩余的行。注意:-上述命令中的`关键字1`、`关键字2`等需要替换为实际的关键字。-如果关键字包含正则表达式特殊字符(如`.`、`*`、`[`、`\`等),需要进行转义,例如`\.`表示实际的点字符。-命令中使用了多个`-e`选项,您也可以将命令写在一起,用分号分隔,例如:`sed '/关键字1/d;/关键字2/d'文件名`(对于情况1)。-情况2的命令使用了嵌套,对于更多关键字,可以继续嵌套,例如四个关键字:`sed-e'/k1/{/k2/{ /k3/{ /k4/d;} }}'`。另外,如果您需要删除包含至少两个关键字(但不一定是全部)的行,那么情况会更复杂,可能需要使用其他工具(如awk)或更复杂的sed脚本。由于您之前提到在不同系统上sed的差异(参考引用[^3]),请注意这些命令在标准sed中应该都能工作。如果您的关键字中包含空格等,请确保正确书写。如果您能提供更具体的需求(例如关键字的数量和逻辑关系),我们可以给出更精确的命令。 §§相关问题§§1.如何转义sed模式中的特殊字符?2.如何使用awk删除包含多个关键字的行?3. sed命令在不同操作系统中的主要差异有哪些?4.如何删除文件中不包含某些关键字的行?5.如何同时使用“与”和“或”条件删除行?</think>要使用 `sed` 命令删除包含多个关键字的行并仅保留剩余行,需结合 `-n` 选项(抑制默认输出)和 `p` 命令(显式打印匹配行)。以下是两种常见场景的解决方案: --- ### **1. 删除包含任意一个关键字的行(逻辑"或")** ```bash sed -n '/关键字1/!{/关键字2/!{/关键字3/!p}}' 文件名 ``` 或等价写法: ```bash sed -n '/\(关键字1\|关键字2\|关键字3\)/!p' 文件名 ``` **说明**: - `-n`:关闭默认输出 - `\(...\|...\)`:正则表达式中的"或"逻辑 - `!p`:对不匹配模式的行执行打印(即保留不包含任意关键字的行) **示例**:删除含 `error` 或 `warning` 的行 ```bash sed -n '/\(error\|warning\)/!p' log.txt ``` --- ### **2. 删除同时包含所有关键字的行(逻辑"与")** ```bash sed -n '/关键字1/{/关键字2/{/关键字3/!p}}; /关键字1/!p' 文件名 ``` **说明**: - 嵌套条件检查:先匹配 `关键字1`,再检查是否含 `关键字2`,最后检查不含 `关键字3` 时打印 - 外层 `/关键字1/!p`:确保完全不包含 `关键字1` 的行也被打印 **示例**:删除同时含 `foo` 和 `bar` 的行 ```bash sed -n '/foo/{/bar/!p}; /foo/!p' data.txt ``` --- ### **关键注意事项** 1. **特殊字符转义**: 若关键字含正则符号(如 `.`、`*`、`[`),需用反斜杠转义: ```bash sed -n '/\(word\.with\.dot\|price\*\)/!p' file ``` 2. **跨平台兼容性**: - macOS 的 BSD `sed` 要求 `-E` 启用扩展正则(如"或"逻辑 `|`): ```bash sed -E -n '/(key1|key2)/!p' file # macOS ``` - Linux 的 GNU `sed` 直接支持 `\|` 或 `-r` 选项(参考引用[^3]关于系统差异) 3. **性能优化**: 处理大文件时,逻辑"或"方案效率更高;复杂逻辑建议改用 `awk`。 --- ### **验证示例** **输入文件 `test.txt`**: ``` Line 1: normal text Line 2: has error Line 3: warning found Line 4: error and warning ``` **删除含 `error` 或 `warning` 的行**: ```bash sed -n '/\(error\|warning\)/!p' test.txt ``` **输出**: ``` Line 1: normal text ``` --- **
阅读全文

相关推荐

最新推荐

recommend-type

slf4j-simple-1.8.0-beta2.jar中文文档.zip

1、压缩文件中包含: 中文文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。
recommend-type

基于gin搭建的go框架.zip

基于gin搭建的go框架.zip
recommend-type

lombok-1.12.2.jar中文文档.zip

1、压缩文件中包含: 中文文档、jar包下载地址、Maven依赖、Gradle依赖、源代码下载地址。 2、使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 3、特殊说明: (1)本文档为人性化翻译,精心制作,请放心使用; (2)只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; (3)不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 4、温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件。 5、本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册。
recommend-type

qhexedit2-doc-0.8.9-11.el8.tar.gz

# 适用操作系统:Centos8 #Step1、解压 tar -zxvf xxx.el8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm
recommend-type

基于go-zero的容器环境.zip

基于go-zero的容器环境.zip
recommend-type

11款开源中文分词引擎性能对比分析

在当今信息时代,中文分词作为自然语言处理中的一个基础且关键环节,对于中文信息检索、机器翻译、语音识别等领域的应用至关重要。分词准确度直接影响了后续的语言分析与理解。由于中文不同于英文等西方语言,中文书写是以连续的字符序列来表达,不存在明显的单词间分隔符,如空格。因此,在处理中文文本之前,必须先进行分词处理,即确定字符串中的词边界。 开放中文分词引擎是指那些提供免费使用的中文文本分词服务的软件。在开放源代码或提供分词API的分词系统上,开发者和研究者可以测试和评估它们在不同场景和数据集上的性能,以便选择最适合特定需求的分词引擎。 本文件标题为“11款开放中文分词引擎测试数据”,意味着内容涉及11个不同的中文分词引擎。这些引擎可能覆盖了从传统基于规则的方法到现代基于机器学习和深度学习的方法,也可能包括了针对特定领域(如医疗、法律等)优化的分词引擎。以下将对这些分词引擎的重要知识点进行详细阐述。 1. 基于规则的分词引擎:这类引擎依据汉语语法规则和词典进行分词。词典会包含大量的词汇、成语、习惯用语等,而规则会涉及汉语构词方式、歧义消解等。优点在于分词速度快,对常见文本的处理效果好;缺点是规则和词典需要不断更新,对新词和专业术语的支持不足。 2. 基于统计的分词引擎:通过大规模的语料库进行训练,统计各个词语的出现概率,从而实现分词。这种方法能够自动学习和适应新词和新用法,但需要的计算资源较大。 3. 基于深度学习的分词引擎:利用深度神经网络模型,如循环神经网络(RNN)和卷积神经网络(CNN),来识别和分词。近年来,基于Transformer架构的预训练模型,如BERT和GPT,也开始被应用到中文分词任务中,具有更好的语境理解和处理能力。 4. 评估指标:通常使用准确率(precision)、召回率(recall)和F1分数作为分词效果的评价指标。准确率是指分词结果中正确词占所有识别词的比例,召回率是指分词结果中正确词占实际正确词的比例,F1分数是准确率和召回率的调和平均。 5. 测试数据集:测试数据集通常由不同类型的文本组成,如新闻、科技文献、社交媒体文本等,用于评估分词引擎在不同场景下的性能。测试数据集的多样性和丰富度是影响分词引擎性能评估的关键。 6. 性能对比:通过对比各款分词引擎在相同测试数据集上的表现,可以分析出哪些分词引擎在准确率、速度、资源消耗等方面表现更优,哪些更适合处理特定类型的文本。 7. 应用场景:分词引擎的选择也依赖于其应用场景。例如,搜索引擎可能更重视速度和准确率,而语音识别则可能更注重实时性和对口语的适应性。 8. 开源分词引擎:一些开源分词引擎如HanLP、结巴分词(Jieba)等,提供了丰富的功能和社区支持,同时便于开发者根据特定需求进行定制和优化。 通过上述内容,我们可以看到中文分词引擎的重要性和测试数据的作用。开发者和研究人员可以根据测试结果,选择适合自己应用需求的分词工具,并且对分词引擎的性能进行优化,进一步提高中文信息处理的质量和效率。
recommend-type

【大规模EEG数据处理技巧】:EEGbdfreader性能优化秘籍

# 摘要 本文综合探讨了大规模EEG数据处理的关键理论和技术实践,重点介绍了一个名为EEGbdfreader的工具及其在数据处理中的应用。文中首先概述了大规模EEG数据处理的挑战,随后深入介绍了EEGbdfreader工具的安装、配置、基本操作和高级功能,包括
recommend-type

安卓studio多行注释快捷键

<think>好的,我现在需要帮助用户查找Android Studio中多行注释的快捷键。首先,我得回想一下自己之前对Android Studio的了解。通常,不同的IDE有不同的注释快捷键,比如Eclipse中使用Ctrl + /,而IntelliJ IDEA系列(包括Android Studio)可能使用类似的快捷方式。不过用户提到的问题可能涉及到特定情况下的快捷键冲突,比如引用[2]中提到的Kotlin方法注释快捷键的问题,这说明用户可能遇到了快捷键不生效的情况,需要检查是否有冲突。 接下来,我应该确认标准的Android Studio多行注释快捷键是什么。根据常规知识,Windows
recommend-type

JavaFX自学资料整理合集

JavaFX是一个由Oracle公司开发的用于构建富客户端应用程序的软件平台。它是Java SE的一个部分,能够帮助开发者创建图形用户界面(GUI)应用程序,这类应用程序具备现代桌面应用的特性,例如多媒体、图形和动画。JavaFX是Java的一个补充,它利用了Java的强大功能,同时提供了更加丰富的组件库和更加灵活的用户界面布局功能。 在自学整理JavaFX的过程中,以下是一些重要的知识点和概念: 1. JavaFX的架构和组件 JavaFX拥有一个模块化的架构,它由多个组件构成,包括JavaFX Scene Builder、JavaFX运行时、JavaFX SDK、NetBeans IDE插件等。JavaFX Scene Builder是一个可视化工具,用于设计UI布局。JavaFX SDK提供了JavaFX库和工具,而NetBeans IDE插件则为NetBeans用户提供了一体化的JavaFX开发环境。 2. JavaFX中的场景图(Scene Graph) 场景图是JavaFX中用于定义和管理用户界面元素的核心概念。它由节点(Nodes)组成,每个节点代表了界面中的一个元素,如形状、文本、图像、按钮等。节点之间可以存在父子关系,形成层次结构,通过这种方式可以组织复杂的用户界面。 3. FXML FXML是一种XML语言,它允许开发者以声明的方式描述用户界面。使用FXML,开发者可以将界面布局从代码中分离出来,使界面设计可以由设计师独立于程序逻辑进行处理。FXML与JavaFX Scene Builder结合使用可以提高开发效率。 4. JavaFX中的事件处理 JavaFX提供了强大的事件处理模型,使得响应用户交互变得简单。事件处理涉及事件监听器的注册、事件触发以及事件传递机制。JavaFX中的事件可以是键盘事件、鼠标事件、焦点事件等。 5. JavaFX的动画与媒体API JavaFX支持创建平滑的动画效果,并且能够处理视频和音频媒体。动画可以通过时间线(Timeline)和关键帧(KeyFrame)来实现。JavaFX媒体API提供了丰富的类和接口,用于控制音视频的播放、暂停、停止、调整音量等。 6. CSS与JavaFX CSS样式表可以用于美化JavaFX应用程序界面,提供与Web开发中相似的样式设置能力。JavaFX应用了大部分CSS 3标准,允许开发者使用CSS来控制节点的样式,比如颜色、字体、边框等。 7. JavaFX的过渡效果和效果库 JavaFX拥有内置的过渡效果库,可以为节点提供多种动画效果,如移动、旋转、缩放和淡入淡出等。除此之外,JavaFX还提供了一系列的效果,如阴影效果、反射效果、模糊效果等,可以应用于节点以增强视觉表现。 8. JavaFX的数据绑定 数据绑定是JavaFX中非常重要的一个特性,它允许开发者将用户界面元素与后端数据源连接起来。数据绑定可以简化代码的编写,减少手动同步数据的需要。 9. JavaFX的模块化 JavaFX的模块化特性使其可以轻松集成到Java应用中,并且可以独立于Java核心库进行下载和更新,这样有利于JavaFX的快速迭代和减少应用体积。 10. JavaFX的多种输入设备支持 JavaFX支持多种输入设备,包括鼠标、键盘、触摸板等。它提供了一套完整的API来处理各种输入设备的事件,使得创建交互式的用户体验成为可能。 了解这些知识点之后,JavaFX的自学和资料整理工作会更加有条理和系统。由于这些内容较为广泛,因此在实际学习过程中,重点应该是逐一深入理解每一个概念,并尝试在实践项目中应用这些知识点。通过编写小程序和应用来实际感受JavaFX的开发流程和操作细节,最终达到熟练掌握的目的。
recommend-type

【MATLAB编程优化术】:针对EEGbdfreader的代码调优策略

# 摘要 EEGbdfreader作为一款处理脑电图(EEG)数据的软件工具,在临床和研究领域有着广泛应用。本文首先介绍了EEGbdfreader的基本功能和面临的性能挑战,随后回顾了MATLAB编程的基础知识,为深入理解软件内部机制和后续优化工作奠定了基础。第三章重点探讨了EEGbdfreader的代码优化策略,包括代码重构、内存管理、数据缓存以及并行计算与多线程的应用,旨在提升程序性能和效率。第四章则深入讲解