显示除最后一个之外的所有字段

时间:2012-12-13 10:27:05

标签: shell sed awk solaris

我有一个文件如下所示

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

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

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

4 个答案:

答案 0 :(得分:11)

这些sedawk解决方案的工作方式与字段数无关。

使用sed

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

注意:-r是扩展正则表达式的标志,可以是-E,因此请与man 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

答案 1 :(得分:4)

反向,切割,反向。

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

或者,从最后一个点替换为无结束:

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

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

答案 2 :(得分:0)

反转字符串上显示cut

cat youFile | rev |cut -d "." -f 2- | rev

答案 3 :(得分:0)

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

awk '{gsub(/[^\.]*$/,"");print}' your_file