Using sed命令从文件或流中删除行是常见操作。
使用删除行的基本语法sed
如下:
sed '/pattern_to_match/d' filename
Here, pattern_to_match
是您要在文件的每一行中匹配的模式。
如果一行包含指定的模式,sed
将删除该行。这d
命令输入sed
用于删除。
在本教程结束时,您将对如何使用sed
命令有效地从文件中删除文本行。让我们开始吧!
删除特定行或多行(按行号)
要从文件中删除特定行或一系列行,您可以指定要删除的行号或行号范围。
删除特定行的语法是:
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
对于删除文本行,许多用户都会犯一些常见的错误。
以下是其中一些问题以及如何避免它们:
-
不转义特殊字符: 特殊字符,例如
*
, .
, ?
, [
, ]
, \
, ^
, $
, and /
有特殊含义sed
和其他命令行实用程序。如果你想按字面意思匹配它们,你需要使用反斜杠转义它们\
.
-
Using
-i
没有备份的选项: The -i
的选项sed
就地修改文件。始终建议在适当修改文件之前创建备份。您可以通过在后指定后缀来创建备份-i
选项,例如-i.bak
.
-
在运行命令之前不测试该命令: 经常测试你的
sed
在将其应用到整个文件之前,先对数据的较小子集或文件的副本执行命令。这将帮助您避免意外删除错误的行或损坏文件。
-
Using
.*
代替.*$
匹配整行: The .*
正则表达式将匹配除换行符之外的任何字符零次或多次。但是,它只会匹配满足表达式所需的字符数。要匹配整行,您应该使用.*$
.
-
Using
d
不指定模式的命令: The d
命令输入sed
删除模式空间。如果您没有在之前指定模式d
命令,它将删除文件中的每一行。
-
未指定
g
替换多次出现时的标志: The g
标记在sed
替换该行中出现的所有模式。如果您不指定g
flag, sed
只会替换每行中第一次出现的模式。
-
不处理空行:使用时空行有时会导致意想不到的结果
sed
。请务必测试您的sed
带有空行的命令以确保其行为符合预期。
请记住在使用之前始终创建文件的备份sed
删除行,尤其是在就地修改文件时。