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


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 解析後、スペースをハイペン-バックに変更します。

誰かがそれを解析するためのベストプラクティスまたはワンライナーシェルコマンドを知っていますか?皆さんありがとう

回答:


10

sedあなたとすることができます:

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

すべての行の終わりから-anything2回のようなパターンに一致し、それを削除します。(...){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、各行の最後の2つのダッシュで区切られた部分文字列を照合して削除するために使用します。 [[:alnum:]]任意の英数字と一致します。

あなたはそれを短くするかもしれません

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

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

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 では機能しません。

標準ではawk、使用に頼らずにsub()(単に模倣するsedことになります)、使用するフィールド(この場合は、最後の2つのダッシュ区切りフィールドを除くすべて)から現在のレコードを再作成する必要があります。

$ 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互換正規表現使用(?...)の2試合を含む-任意の非続く-文字を
  • -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、区切り文字を使用して、各入力行を配列に自動分割し-ます。

次に、最後の2つのフィールドを除くすべての配列スライスを出力し、-文字で再結合します。


1

以下に示すように、さまざまな方法で実行できます。

$ 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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.