行末で「-」で区切られた1つ以上のフィールドを削除します。

行末で「-」で区切られた1つ以上のフィールドを削除します。

データを分析したい。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解析後、スペースをハイフンに変更します-

解析のためのベストプラクティスや1行のシェルコマンドを知っている人はいますか?みんなありがとう

答え1

一緒にsedできること:

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

各行の終わりに-anything同じパターンを2回見つけて削除します。(...){2}$

答え2

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

これは、sed各行のダッシュで区切られた最後の2つの部分文字列と一致して削除されます。 [[:alnum:]]すべての英数字と一致します。

に短縮してください

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

-[[:alnum:]]*つまり、各行の終わりにある2つのセットのathを一致させて削除します。

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では、using(単に模倣)をawk使用せずに使用したいフィールド(この場合はダッシュで区切られた最後の2つのフィールドを除くすべてのフィールド)で現在のレコードを再作成する必要があります。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

答え3

そして:revcut

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

行を反転し、cutフィールド 3 を行の最後まで変更し、テキストを反転します。


使用grep(およびPCRE):

grep -Po '.*(?=(-[^-]*){2}$)' file
  • -P(?...)2つの一致-とそれに続く文字以外の-ものを含むPerl互換正規表現を使用してください。
  • -o一致する部分のみ印刷

答え4

次のように、さまざまな方法でこれを実行できます。

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

ダッシュで線を分割し、配列要素コネクタをダッシュ​​に設定し、最後の2つの要素を切り取り、現在の行をダッシュ​​で連結された配列に設定します。

$ 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

関連情報