使用 Sed 命令删除行:Linux 文本删除教程

2023-10-19

Using sed命令从文件或流中删除行是常见操作。

使用删除行的基本语法sed如下:


sed '/pattern_to_match/d' filename
  

Here, pattern_to_match是您要在文件的每一行中匹配的模式。

如果一行包含指定的模式,sed将删除该行。这d命令输入sed用于删除。

在本教程结束时,您将对如何使用sed命令有效地从文件中删除文本行。让我们开始吧!

 

目录 hide

 

删除特定行或多行(按行号)

要从文件中删除特定行或一系列行,您可以指定要删除的行号或行号范围。

删除特定行的语法是:


sed 'Nd' filename
  

Where N是要删除的行的行号。

考虑一个名为example.txt包含以下内容:


apple
banana
cherry
date  

例如,删除第二行example.txt文件,可以使用以下命令:


sed '2d' example.txt
  

Output:


apple
cherry
date
  

第二行“banana”已从输出中删除。

要删除一定范围的行,您可以指定起始行号和结束行号,如下所示:


sed 'M, Nd' filename
  

Where M是起始行号并且N是结束行号。

例如,删除第 2 行到第 3 行example.txt文件,可以使用以下命令:


sed '2,3d' example.txt
  

Output:


apple
date
  

第 2 行和第 3 行(“banana”和“cherry”)已从输出中删除。

请记住,要从文件中永久删除一行或多行,您应该使用-i option:


sed -i '2d' example.txt
  

这将永久删除第二行example.txt.

 

删除重复行

虽然sed不是执行此任务的最有效工具(uniq命令更适合),但仍然可以使用它来完成它。

使用删除重复行的基本语法sed is:


sed '$!N; /^\(.*\)\n\1$/!P; D' filename
  

This sed命令一次读取两行并进行比较。如果它们相同,则删除重复行。让我们分解一下命令:

  • $!N;一次读取两行。
  • /^\(.*\)\n\1$/!P;比较两行,如果不相同则打印第一行。
  • D删除第一行,下一行成为当前行。

让我们考虑一个文件duplicates.txt包含以下内容:


apple
apple
banana
cherry
cherry
date
  

Run the sed命令如下:


sed '$!N; /^\(.*\)\n\1$/!P; D' duplicates.txt
  

Output:


apple
banana
cherry
date
  

重复的行“apple”和“cherry”已从输出中删除。

 

删除文件的第一行或最后一行

要删除文件的第一行,可以使用以下命令sed命令:


sed '1d' filename
  

例如,如果要删除第一行fruits.txt文件,可以使用以下命令:


sed '1d' fruits.txt
  

Output:


banana
cherry
date
fig
grape
  

第一行“apple”已从输出中删除。

删除最后一行

要删除文件的最后一行,可以使用以下命令sed命令:


sed '$d' filename
  

例如,如果要删除最后一行fruits.txt文件,可以使用以下命令:


sed '$d' fruits.txt
  

Output:


apple
banana
cherry
date
fig
  

最后一行“grape”已从输出中删除。

 

删除除特定行之外的所有行

删除除与特定模式匹配的行之外的所有行的语法是:


sed '/pattern_to_keep/!d' filename
  

例如,考虑一个文件colors.txt包含以下内容:


red
blue
green
yellow
orange
  

如果您只想保留包含“blue”或“green”的行,可以使用以下命令:


sed '/blue\|green/!d' colors.txt
  

Output:


blue
green
  

除包含“蓝色”或“绿色”的行外,所有行均已从输出中删除。

在这里,我们删除与特定模式“蓝色”或“绿色”不匹配的行。

 

删除以特定模式开头或结尾的行

sed可用于删除以特定模式开头或结尾的行。

删除以特定模式开头的行

删除以特定模式开头的行的语法是:


sed '/^pattern_to_match/d' filename
  

例如,考虑一个文件items.txt包含以下内容:


apple
banana
cherry
date
  

如果要删除所有以“a”开头的行,可以使用以下命令:


sed '/^a/d' items.txt
  

Output:


banana
cherry
date
  

以“a”(“apple”)开头的行已从输出中删除。

删除以特定模式结尾的行

删除以特定模式结尾的行的语法是:


sed '/pattern_to_match$/d' filename
  

例如,如果要删除所有以“e”结尾的行,可以使用以下命令:


sed '/e$/d' items.txt
  

Output:


banana
cherry
  

以“e”(“apple”和“date”)结尾的行已从输出中删除。

 

删除不区分大小写的匹配行

您可以使用I标志使匹配不区分大小写。

删除不区分大小写匹配的行的语法是:


sed '/pattern_to_match/Id' filename
  

例如,考虑一个文件flowers.txt包含以下内容:


Rose
Tulip
SUNFLOWER
daisy
LILY
  

如果要删除所有包含“rose”(不区分大小写)的行,可以使用以下命令:


sed '/rose/Id' flowers.txt
  

Output:


Tulip
SUNFLOWER
daisy
LILY
  

包含“Rose”(不区分大小写)的行已从输出中删除。

 

使用正则表达式删除行

sed支持基本正则表达式 (BRE) 和扩展正则表达式 (ERE),您可以使用它们来定义更复杂的行删除模式。

例如,考虑一个文件numbers.txt包含以下内容:


one
two
three
four
five
  

如果要删除所有包含元音后跟辅音的行,可以使用以下命令:


sed '/[aeiou][bcdfghjklmnpqrstvwxyz]/d' numbers.txt
  

Output:


one
  

除“one”之外的所有行都包含一个元音,后跟一个辅音,因此它们已从输出中删除。

如果你想使用扩展正则表达式(ERE),你应该使用-E option:


sed -E '/[aeiou][bcdfghjklmnpqrstvwxyz]/d' numbers.txt
  

该命令与上一个命令具有相同的效果,但它使用扩展正则表达式而不是基本正则表达式。

 

删除文件开头或结尾的行

sed可用于从文件的开头或结尾删除特定数量的行。

从文件开头删除行

从文件开头删除特定行数的语法是:


sed '1,Nd' filename
  

Where N是要删除的行数。

例如,考虑一个文件fruits.txt包含以下内容:


apple
banana
cherry
date
fig
  

如果要删除前两行,可以使用以下命令:


sed '1,2d' fruits.txt
  

Output:


cherry
date
fig
  

前两行“apple”和“banana”已从输出中删除。

从文件末尾删除行

从文件末尾删除特定行数的语法有点复杂:


sed -e :a -e '/^\n*$/N;/\n$/ba' samplefile.txt | sed 'N;$!P;$!D;$d'
  

例如,如果要删除最后两行fruits.txt,您可以使用以下命令:


sed -e :a -e '/^\n*$/N;/\n$/ba' fruits.txt | sed 'N;$!P;$!D;$d'
  

Output:


apple
banana
cherry
  

最后两行“date”和“fig”已从输出中删除。

我们来解释一下这个命令:

  • -e :a定义一个标签a.
  • -e '/^\n*$/N;/\n$/ba'如果当前行为空或未到达文件末尾,则将下一行追加到模式空间。如果到达文件末尾,它将跳出循环并打印整个模式空间。
  • N将下一行追加到模式空间。
  • $!P如果未到达文件末尾,则打印模式空间的第一行。
  • $!D如果未到达文件末尾,则删除模式空间的第一行。
  • $d如果到达文件末尾,则删除模式空间。

 

根据条件删除行

您可以删除具有一定长度的所有行或包含一定数量单词的所有行。

根据长度删除行

根据长度删除行的语法是:


sed '/.\{N\}/d' filename
  

Where N是要删除的行的长度。

例如,考虑一个文件words.txt包含以下内容:


one
two
three
four
five
  

如果要删除所有恰好包含三个字符的行,可以使用以下命令:


sed '/^.\{3\}$/d' words.txt
  

Output:


three
four
five
  

上面的命令执行以下操作:

  • ^匹配行的开头
  • .匹配除换行符之外的任何字符
  • \{3\}指定前一个字符(可以是任意字符)应该恰好出现 3 次
  • $匹配行尾
  • d删除这些行

“one”和“two”行恰好包含三个字符,已从输出中删除。

根据字数删除行

根据行包含的单词数删除行的语法是:


sed '/^[[:space:]]*[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]*$/d' filename
  
Let's say you have a file called file.txt with the following content:

apple orange
banana
cherry grape lemon
  

例如,如果要删除恰好包含两个单词的所有行,可以使用以下命令:


sed '/^[[:space:]]*[^[:space:]]\+[[:space:]]\+[^[:space:]]\+[[:space:]]*$/d' file.txt  

Output:


banana
cherry grape lemon
  

我们来解释一下这个命令:

  • ^[[:space:]]*:匹配行的开头,后跟任意数量的空格(或无空格)。
  • [^[:space:]]\+:匹配一个或多个非空白字符。
  • [[:space:]]+:匹配一个或多个空白字符。
  • [^[:space:]]\+:再次匹配一个或多个非空白字符。
  • [[:space:]]*$:匹配任意数量的空格(或无),后跟行尾。
  • d: 删除这些行。

“apple Orange”这一行已被删除,因为它只包含两个单词。

 

从具有特定扩展名的文件中删除行

您可以使用查找命令结合sed从文件中删除行。

从具有特定扩展名的文件中删除行的语法是:


find /path/to/directory -type f -name "*.ext" | xargs sed -i '/pattern_to_match/d'
  

Where /path/to/directory是目录的路径,.ext是文件扩展名,并且pattern_to_match是要删除的线的模式。

例如,考虑一个目录docs其中包含多个.txt files.

如果要删除所有以“#”开头的行.txt目录中的文件,可以使用以下命令:


find docs -type f -name "*.txt" | xargs sed -i '/^#/d'
  

这将从所有以“#”开头的行中删除.txt文件在docs.

使用此命令时要小心,因为它将永久删除目录中具有指定扩展名的所有文件中的指定行。

 

删除所有空行

从文件中删除所有空行的语法是:


sed '/^$/d' filename
  

例如,考虑一个文件example.txt包含以下内容:


This is an example file.

It contains some text.

And some empty lines.
  

如果要删除所有空行,可以使用以下命令:


sed '/^$/d' example.txt
  

Output:


This is an example file.
It contains some text.
And some empty lines.
  

所有空行已从输出中删除。

 

删除文件开头或结尾的所有空行

删除文件开头的所有空行的语法是:


sed '/./,$!d' filename
  

例如,考虑一个文件example.txt包含以下内容:


<empty line>
<empty line>
This is the start of the file.
It contains some text.
  

如果想删除开头的所有空行,可以使用以下命令:


sed '/./,$!d' example.txt
  

Output:


This is the start of the file.
It contains some text.
  

删除文件末尾的空行

删除文件末尾的空行更为复杂。您可以使用以下内容sed命令:


sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' filename
  

例如,考虑一个文件example.txt包含以下内容:


This is the start of the file.
It contains some text.
<empty line>
<empty line>
  

如果要删除末尾的所有空行,可以使用以下命令:


sed -e :a -e '/^\n*$/{$d;N;ba' -e '}' example.txt
  

Output:


This is the start of the file.
It contains some text.
  

我们来理解一下这个命令:

  • -e :a:这定义了一个标签a.
  • -e '/^\n*$/{$d;N;ba' -e '}': 这个是单曲sed表达分布在两个人身上-e选项,因为表达式包含}字符,否则将被视为结尾sed script.
  • /^\n*$/:匹配完全由换行符组成(或为空)的行。
  • {$d;N;ba: This is a block of sed commands that will be executed if the current line matches the /^\n*$/ pattern.
    • $d:如果当前行是文件中的最后一行,则删除当前行。
    • N:这会将下一行追加到模式空间。
    • ba:这分支到a标签,本质上是创建一个循环,一直持续到到达文件末尾。
  • }:这将关闭块sed命令。

 

删除包含特殊字符的行

特殊字符如*, ., ?, [, ], \, ^, $, and /有特殊含义sed和其他命令行实用程序,因此您需要使用反斜杠转义它们\如果你想从字面上匹配它们。

删除包含特殊字符的行的语法是:


sed '/\character/d' filename
  

Where character是特殊字符。

例如,考虑一个文件special.txt包含以下内容:


This is a normal line.
This line contains a * special character.
Another normal line.
This line contains a . special character.
  

如果要删除所有包含*字符,可以使用以下命令:


sed '/\*/d' special.txt
  

Output:


This is a normal line.
Another normal line.
This line contains a . special character.
  

该行包含*字符已从输出中删除。

 

删除不可打印的字符

不可打印字符,例如转义字符 (ESC)、响铃字符 (BEL) 和空字符 (NULL)。

从文件中删除不可打印字符的语法是:


sed 's/[^[:print:]]//g' filename
  

This sed命令将从文件中删除所有不可打印的字符。

例如,考虑一个文件nonprintable.txt包含一些不可打印的字符:


Hello World!This is a test.Special characters:
  

如果要删除所有不可打印字符,可以使用以下命令:


sed 's/[^[:print:]]//g' nonprintable.txt
  

Output:


Hello World!This is a test.Special characters:
  

所有不可打印的字符已从输出中删除。

 

使用删除文本时常犯的错误sed

使用时sed对于删除文本行,许多用户都会犯一些常见的错误。

以下是其中一些问题以及如何避免它们:

  1. 不转义特殊字符: 特殊字符,例如*, ., ?, [, ], \, ^, $, and /有特殊含义sed和其他命令行实用程序。如果你想按字面意思匹配它们,你需要使用反斜杠转义它们\.
  2. Using -i没有备份的选项: The -i的选项sed就地修改文件。始终建议在适当修改文件之前创建备份。您可以通过在后指定后缀来创建备份-i选项,例如-i.bak.
  3. 在运行命令之前不测试该命令: 经常测试你的sed在将其应用到整个文件之前,先对数据的较小子集或文件的副本执行命令。这将帮助您避免意外删除错误的行或损坏文件。
  4. Using .*代替.*$匹配整行: The .*正则表达式将匹配除换行符之外的任何字符零次或多次。但是,它只会匹配满足表达式所需的字符数。要匹配整行,您应该使用.*$.
  5. Using d不指定模式的命令: The d命令输入sed删除模式空间。如果您没有在之前指定模式d命令,它将删除文件中的每一行。
  6. 未指定g替换多次出现时的标志: The g标记在sed替换该行中出现的所有模式。如果您不指定g flag, sed只会替换每行中第一次出现的模式。
  7. 不处理空行:使用时空行有时会导致意想不到的结果sed。请务必测试您的sed带有空行的命令以确保其行为符合预期。

请记住在使用之前始终创建文件的备份sed删除行,尤其是在就地修改文件时。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Sed 命令删除行:Linux 文本删除教程 的相关文章

随机推荐

  • 如何从 Ubuntu Linux 中删除(删除)PPA

    如果您已经使用 Ubuntu 一段时间 您可能熟悉术语 PPA 它代表个人软件包存档 PPA 是安装和更新官方 Ubuntu 存储库中未提供的软件的好方法 但是 有时您可能想要删除 PPA 因为不再需要它或因为它导致问题 在本文中 我们将完
  • 20 个常见的 JavaScript 面试问题和答案

    JavaScript 是世界上最流行的编程语言之一 因此 这也是技术面试中最常被问到的话题之一 无论您是初学者还是经验丰富的开发人员 为 JavaScript 面试问题做好充分准备都很重要 在本文中 我们将讨论 20 个常见的 JavaSc
  • 如何在 Ubuntu 15.10、14.04 和 12.04 上安装 RabbitVCS

    兔子VCS是版本管理系统 SVN 和 Git 的图形客户端 它提供了一个简单且易于使用的图形用户界面 可以说 RabbitVCS 是 TortoiseSVN 的最佳 Linux 替代品 本教程将帮助您在 Ubuntu 15 10 14 04
  • 如何更改 Linux 内核中的 Swappiness 值

    Swappiness 是一个 Linux 内核参数 用于控制交换空闲进程和使用可用 RAM 内存之间的平衡 大多数Linux发行版中的默认交换值是60 这意味着当可用内存低于40 时系统开始交换进程 但是 此默认值可能并不适合所有情况 更改
  • Linux 中的 du 命令及有用示例

    du 是缺少磁盘使用 这意味着 du 命令计算文件在磁盘上使用的大小 它是Linux系统用户经常使用的基本Linux命令 Syntax du OPTION FILE 在本教程中 您将通过有用的示例了解 du 命令在 Linux 中的用法 d
  • 如何在 PHP 中向数组追加项目

    问题 如何在 PHP 中向数组追加项目 如何在 PHP 中将任何元素追加到现有数组的末尾 如何在 PHP 中将元素推送到数组 本教程使用数组推 函数将新元素插入或追加到数组末尾 PHP 将元素追加到数组 以下示例创建一个包含两个元素 如 b
  • 如何在 Ubuntu 18.04 上安装 Yarn

    Yarn 是一个与 npm 兼容的 JavaScript 包管理器 可帮助您自动执行安装 更新 配置和删除 npm 包的过程 它的创建是为了解决 npm 的一系列问题 例如通过并行操作加快软件包安装过程并减少与网络连接相关的错误 在本教程中
  • 如何在 CentOS 7 上安装 Python 3

    本教程将指导您使用 Software Collections SCL 以及发行版默认 Python 版本 2 7 在 CentOS 7 系统上安装 Python 3 我们还将向您展示如何创建 Python 虚拟环境 Python 是世界上最
  • 如何在 Debian 10 Linux 上安装 Vagrant

    Vagrant是一个用于构建和管理虚拟机环境的开源命令行工具 默认情况下 Vagrant 可以在 VirtualBox Hyper V 之上配置计算机 和码头工人 其他提供商如 Libvirt KVM VMware 和 AWS 可以通过 V
  • Linux 中的 Wget 命令及示例

    GNU Wget 是一个用于从网络下载文件的命令行实用程序 使用 Wget 您可以使用 HTTP HTTPS 和 FTP 协议下载文件 Wget 提供了许多选项 允许您下载多个文件 恢复下载 限制带宽 递归下载 后台下载 镜像网站等等 本文
  • 如何在 Ubuntu 20.04 上安装 Odoo 15

    Odoo 是一款流行的开源商业应用程序套件 可帮助公司管理和运营其业务 它包括广泛的应用程序 例如 CRM 电子商务 网站构建器 计费 会计 制造 仓库 项目管理 库存等等 所有这些都无缝集成 Odoo根据使用案例和可用技术 可以以不同的方
  • 如何在 Debian 10 Linux 上安装 Node.js 和 npm

    Node js 是一个基于 Chrome JavaScript 构建的跨平台 JavaScript 运行时环境 旨在在服务器端执行 JavaScript 代码 使用 Node js 您可以构建可扩展的网络应用程序 npm 是 Node js
  • 如何在 Debian 9 上安装 Java

    在本教程中 我们将逐步介绍在 Debian 9 上安装 Java Java 是用于构建不同类型的应用程序和系统的最流行的编程语言之一 用 Java 开发的应用程序具有可扩展性 灵活性和可维护性 有两种不同的 Java 包 Java 运行时环
  • 如何在 Debian 9 上安装和使用 PHP Composer

    Composer是 PHP 的依赖管理器 类似于Node js 的 npm or Python 的点子 Composer 将提取您的项目所依赖的所有必需的 PHP 包并为您管理它们 本教程提供了在 Debian 9 系统上安装 Compos
  • 如何列出 CentOS 上已安装的软件包

    在本教程中 我们将向您展示如何列出和过滤 CentOS 上已安装的软件包 当您需要在另一台计算机上安装相同的软件包或想要重新安装系统时 了解如何列出 CentOS 系统上已安装的软件包会很有帮助 我们还将向您展示如何检查是否安装了特定的软件
  • 如何检查您的 CentOS 版本

    当您第一次登录 CentOS 计算机时 在进行任何工作之前 您可能需要检查系统上运行的 CentOS 版本 在本教程中 我们将展示几个不同的命令 了解如何检查系统上安装的 CentOS 版本 截至撰写本文时 CentOS Linux 拥有三
  • 如何在 CentOS 8 上添加交换空间

    交换空间是磁盘上的空间 当物理 RAM 内存已满时使用 当 Linux 系统耗尽 RAM 时 非活动页面将从 RAM 移至交换空间 交换空间可以采用专用交换分区或交换文件的形式 通常 在虚拟机上运行 CentOS 时 不存在交换分区 因此唯
  • 配置 Magento 2 在 CentOS 7 上使用 Varnish

    页面速度或加载时间对于在线商店的成功至关重要 加载时间是加载特定页面上的内容所需的总时间 加载时间越长 转化率越低 这也是谷歌考虑确定搜索引擎排名的最重要因素之一 在第一篇文章中 我们在 CentOS 7 机器上安装了 Magento 2
  • 自动启动 wampserver 在 Windows 10 上自动启动

    在向您展示如何自动启动 wampserver 之前 我先简单介绍一下 Wampserver 是 Windows 平台上最好的 Web 开发堆栈之一 与 xampp 相比 我更喜欢它 因为它有方便的托盘菜单 可以让我访问任何配置 您可以从此网
  • 使用 Sed 命令删除行:Linux 文本删除教程

    Using sed命令从文件或流中删除行是常见操作 使用删除行的基本语法sed如下 sed pattern to match d filename Here pattern to match是您要在文件的每一行中匹配的模式 如果一行包含指定