以下のようなファイルがあります
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