在行尾删除一个或多个用“-”分隔的字段


8

我将解析数据googleapis.txt

bucket,abc-def-ghi-45gjd4-wwxis
bucket,dde-wwq-ooi-66ciow-po22q
instance,jkl-mno-1-zzz-68dkakw-oo9w8
disk,pqr-stu-10-kuy-l2oxapw-rp4lt

我期望下面的结果

bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

我以为我必须更改-为空格然后运行此命令

cat googleapis.txt | awk '{$NF="";sub(/[ \t]+$/,"")}1' | awk '{$NF="";sub(/[ \t]+$/,"")}1'

我从https://stackoverflow.com/a/27794421/8162936中获得了 解析后的信息,我将把该空间更改为hypen -

有谁知道最佳实践或一线shell命令来解析它?谢谢大家

Answers:


10

sed您可以做到:

sed -E 's/(-[^-]*){2}$//' infile

从每行末尾匹配-anything两次这样的模式并将其删除。(...){2}$


7
$ sed 's/-[[:alnum:]]*-[[:alnum:]]*$//' file
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

这用于sed匹配每行的最后两个破折号分隔的子字符串并将其删除。 [[:alnum:]]将匹配任何字母数字字符。

您可以将其缩短为

sed 's/\(-[[:alnum:]]*\)\{2\}$//' file

即,匹配并删除-[[:alnum:]]*每行末尾的两组。

使用GNU awk,您还可以

$ awk -F '-' 'BEGIN { OFS=FS } { NF -= 2; print }' file
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

但这样的更改NF是不可移植的,因此应避免(不保证它会更改当前记录)。awk例如,它不适用于BSD 。

使用standard时awk,如果不求助于使用sub()(这只是模仿sed),则必须从要使用的字段(在我们的情况下,是除最后两个破折号分隔的字段之外的所有字段)中重新创建当前记录:

$ awk -F '-' 'BEGIN { OFS=FS } { nf = split($0,a) - 2; $0=""; for (i=1; i<=nf; ++i) $i = a[i]; print }' file
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

4

revcut

rev file | cut -d'-' -f3- | rev

反转行,将cut字段3移至行尾,然后再次反转文本。


使用grep(和PCRE):

grep -Po '.*(?=(-[^-]*){2}$)' file
  • -P使用与perl兼容的正则表达式,且正向查找(?...)包含两个匹配项,-后跟任何非-字符
  • -o 仅打印匹配的零件

4
$ perl -F- -lane 'print join "-", @F[0..($#F-2)]' googleapis.txt
bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy

这将@F使用定界符将每条输入线自动拆分为数组-

然后,它将打印除最后两个字段以外的所有字段的数组切片,并重新与-字符连接。


1

您可以按照以下所示的多种方式进行操作:

$ perl -F- -pale '$"="-";$#F-=2;$_="@F"' file

分割破折号上的线,将数组元素连接器设置为破折号,剪辑最后两个元素,并将当前行设置为使用破折号连接的数组。

$ awk -F- '{
   t = $1
   for ( i=2; i<NF-1; i++ ) t = t FS $i
   $0 = t
}1' file

这是使用纯字符串处理的:

$ perl -lne 'print substr($_, 0, rindex($_,"-",-1+rindex($_,"-")))' file

$ sed -ne '
   y/-/\n/
   :a;h;s/\n/-/;/\n.*\n/ba
   g;P
' file

结果:

bucket,abc-def-ghi
bucket,dde-wwq-ooi
instance,jkl-mno-1-zzz
disk,pqr-stu-10-kuy
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.