我有一个包含以下几行的文件。
**;**;**;
*(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
g
全局搜索d
删除x
保存并关闭