以下のようなファイルがあります
1.2.3.4.ask
sanma.nam.sam
c.d.b.test
各行から最後のフィールドを削除したいのですが、区切り文字は.であり、フィールドの数は一定ではありません。
awk誰かがまたはsed解決策を見つけるために私を助けることができますか?ここでは使えませんperl。
これらsedとawkソリューションの両方が、フィールドの数に関係なく機能します。
使用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
裏返す、切る、裏返す。
rev file | cut -d. -f2- | rev >newfile
または、最後のドットから最後までを何も置き換えません。
sed 's/\.[^.]*$//' file >newfile
正規表現[^.]は、ドット (または改行) ではない 1 文字に一致します。*繰り返し演算子は「貪欲」であるため、ドットを除外する必要があります。一番左の、可能な限り長い一致が選択されます。
「。」を保持したい場合。以下を使用します。
awk '{gsub(/[^\.]*$/,"");print}' your_file
cut裏返した弦に
cat youFile | rev |cut -d "." -f 2- | rev