我有一个巨大的文本文件,其中包含许多行:
asdasdasdaasdasd_DATA_3424223423423423
gsgsdgsgs_DATA_6846343636
.....
我想为每一行替换DATA_ ..到最后,只有空格,所以我会得到:
asdasdasdaasdasd_DATA_
gsgsdgsgs_DATA_
.....
我知道你可以做类似的事情:
sed -e "s/^DATA_*$/DATA_/g" filename.txt
但它不起作用。
你知道吗?
由于
答案 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_