如何使用 sed 命令删除包含星号的行

如何使用 sed 命令删除包含星号的行

我有一个包含以下几行的文件。

**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**

我想使用 Sed 命令删除所有包含以下模式的行。

**;**;**;
**;**;**

请帮助我。谢谢。

答案1

sed '/\*\*;\*\*;\*\*;\?/d' file
  • \*\*;\*\*;\*\*;\?: 匹配一个**;**;**字符串,后面可以随意加一个;字符;
  • d:删除该行。

要就地编辑文件:

sed -i '/\*\*;\*\*;\*\*;\?/d' file
% cat file                                          :(
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
% sed '/\*\*;\*\*;\*\*;\?/d' file
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
% 

答案2

更一般地说,要删除仅包含分号和星号的任何行:

sed '/^[*;]\+$/d'

尽管您不需要将自己限制在 sed 中:

grep -Ev '^[*;]+$'

答案3

kos 的答案已经完成了工作。我的答案只是稍微改进了正则表达式。

通过使用分组模式\( \)和转义符,.\+我们可以告诉它匹配整个组 **;以及后面的内容。在这个例子中,我使用

$  sed -e "s|\(\*\*;\).\+|TEST|g"  stars.txt                            
TEST
*(Eng_Sen:This is an apple)TEST
TEST
TEST
*(Eng_Sen:This is an apple)TEST
TEST

请注意,GNUsed版本可以在替换命令中使用任何字符作为分隔符,而不仅仅是/。这里我使用了竖线。

在上面的例子中,我擅自将 OP 的例子从 3 行增加到 6 行。

$ cat stars.txt                                                
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**
**;**;**;
*(Eng_Sen:This is an apple)*;*(WordID:1 2 3 4)*;*(message:)*;
**;**;**

答案4

你可以在 Ex 模式下使用 Vim:

ex -sc 'g/\*\*/d' -cx file
  1. g全局搜索

  2. d删除

  3. x保存并关闭

相关内容