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

use*_*857 9 shell awk solaris sed

我有一个文件如下所示

1.2.3.4.ask
sanma.nam.sam
c.d.b.test
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*our 12

这些sedawk解决方案都可以独立于字段数量工作.

使用sed:

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

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

sed 's/\(.*\)\..*/\1/' file
1.2.3.4
sanma.nam
c.d.b
Run Code Online (Sandbox Code Playgroud)

sed解决方案是做一个贪婪的比赛直到最后.和捕捉一切它,它取代只匹配部分(整条生产线前n-1场).-i如果要将更改存储回文件,请使用该选项.

使用awk:

$ awk 'BEGIN{FS=OFS="."}{NF--; print}' file
1.2.3.4
sanma.nam
c.d.b
Run Code Online (Sandbox Code Playgroud)

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

$ awk 'BEGIN{FS=OFS="."}{NF--; print}' file > tmp && mv tmp file
Run Code Online (Sandbox Code Playgroud)

  • @thor 一定会喜欢 `awk` ;) (2认同)

tri*_*eee 9

反转,切开,反转回来。

rev file | cut -d. -f2- | rev >newfile
Run Code Online (Sandbox Code Playgroud)

或者,从最后一个点到最后什么都不替换:

sed 's/\.[^.]*$//' file >newfile
Run Code Online (Sandbox Code Playgroud)

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