12

我有一个如下所示的文件

1.2.3.4.ask
sanma.nam.sam
c.d.b.test

我想从每一行中删除最后一个字段,分隔符是.并且字段数不是恒定的。

任何人都可以帮助我awksed找出解决方案。我不能perl在这里使用。

4

4 回答 4

19

这些sedawk解决方案都与字段数量无关。

使用sed

$ sed -r 's/(.*)\..*/\1/' file
1.2.3.4
sanma.nam
c.d.b

注意:-r是扩展正则表达式的标志,可以-Eman sed. 如果您的版本sed没有此标志,则只需转义括号:

sed 's/\(.*\)\..*/\1/' file
1.2.3.4
sanma.nam
c.d.b

sed解决方案是进行贪婪匹配直到最后一个并捕获它之前的.所有内容,它只用匹配的部分(n-1字段)替换整行。-i如果您希望将更改存储回文件,请使用该选项。

使用awk

$ awk 'BEGIN{FS=OFS="."}{NF--; print}' file
1.2.3.4
sanma.nam
c.d.b

awk解决方案只是简单地打印n-1字段,将更改存储回文件使用重定向:

$ awk 'BEGIN{FS=OFS="."}{NF--; print}' file > tmp && mv tmp file
于 2012-12-13T10:33:57.753 回答
4

倒车、剪车、倒车。

rev file | cut -d. -f2- | rev >newfile

或者,从最后一个点替换为什么都没有结束:

sed 's/\.[^.]*$//' file >newfile

正则表达式[^.]匹配一个不是点(或换行符)的字符。您需要排除点,因为重复运算符*是“贪婪的”;它将选择最左边,最长的匹配。

于 2012-12-13T10:30:48.007 回答
1

如果你想保留“。” 在下面使用:

awk '{gsub(/[^\.]*$/,"");print}' your_file
于 2012-12-13T10:37:09.960 回答
1

cut倒转的字符串上

cat youFile | rev |cut -d "." -f 2- | rev
于 2012-12-13T10:32:14.017 回答