shell - 显示除最后一个字段以外的所有字段

标签 shell sed awk solaris

我有一个如下所示的文件

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

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

任何人都可以帮助我awksed找出解决办法。我不能用 perl这里。

最佳答案

这两个 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

关于shell - 显示除最后一个字段以外的所有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13857836/

相关文章:

sed - 在applescript中通过sed用撇号文本替换文本

linux - sed:如何处理反斜杠?

linux - 如何使用 awk 打印选定的连续和随机列

linux - 如何在 awk 中使用多个操作来编辑文本文件

linux - 在 shell 脚本/SED/AWK 中搜索 A 并替换 A|B 中的 B

linux - 一次重启多个服务的Shell脚本

linux - 如何使用awk从/etc/passwd中提取姓氏?

git - sh.exe 阻止 Windows cmd move 命令工作

regex - 如何使用sed从字符串中提取文本?

linux - 是否可以使用 bash 函数检测参数末尾的空格?