替换直到bash的终点

时间:2010-03-16 14:20:32

标签: regex bash

我有一个巨大的文本文件,其中包含许多行:

asdasdasdaasdasd_DATA_3424223423423423
gsgsdgsgs_DATA_6846343636

.....

我想为每一行替换DATA_ ..到最后,只有空格,所以我会得到:

asdasdasdaasdasd_DATA_
gsgsdgsgs_DATA_

.....

我知道你可以做类似的事情:

sed -e "s/^DATA_*$/DATA_/g" filename.txt

但它不起作用。

你知道吗?

由于

3 个答案:

答案 0 :(得分:2)

您有两个问题:您不必要地将行的开头和结尾与^$匹配,而您正在寻找_*(零或多个下划线)而不是.*(零个或多个任何角色。这就是你想要的:

sed -e 's/_DATA_.*/_DATA_/'

最后的g(全局)不会做任何事情,因为你已经要从“ DATA ”的第一个实例中删除所有内容 - 可以'是另一场比赛。

P.S。如果你只有一个表达式,那么-e并不是绝对必要的,但是如果你认为你可以更多地使用它,那么这是一个方便的习惯。

答案 1 :(得分:1)

使用正则表达式,*表示前一个字符,任意次。要匹配任何字符,请使用.

所以你真正想要的是.*,这意味着任何角色,任意次数,如下所示:

sed 's/DATA_.*/DATA_/' filename.txt

此外,我删除了^,这意味着行首,因为您想要匹配“DATA_”,即使它不在行的开头。

答案 2 :(得分:1)

使用awk。将字段分隔符设置为“ DATA ”,然后获取字段1($1)。不需要正则表达式

$ awk -F"_DATA_" '{print $1"_DATA_"}' file
asdasdasdaasdasd_DATA_
gsgsdgsgs_DATA_