12

以下のようなファイルがあります

1.2.3.4.ask
sanma.nam.sam
c.d.b.test

各行から最後のフィールドを削除したいのですが、区切り文字は.であり、フィールドの数は一定ではありません。

awk誰かがまたはsed解決策を見つけるために私を助けることができますか?ここでは使えませんperl

4

4 に答える 4

19

これらsedawkソリューションの両方が、フィールドの数に関係なく機能します。

使用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
于 2012-12-13T10:33:57.753 に答える
4

裏返す、切る、裏返す。

rev file | cut -d. -f2- | rev >newfile

または、最後のドットから最後までを何も置き換えません。

sed 's/\.[^.]*$//' file >newfile

正規表現[^.]は、ドット (または改行) ではない 1 文字に一致します。*繰り返し演算子は「貪欲」であるため、ドットを除外する必要があります。一番左の、可能な限り長い一致が選択されます。

于 2012-12-13T10:30:48.007 に答える
1

「。」を保持したい場合。以下を使用します。

awk '{gsub(/[^\.]*$/,"");print}' your_file
于 2012-12-13T10:37:09.960 に答える
1

cut裏返した弦に

cat youFile | rev |cut -d "." -f 2- | rev
于 2012-12-13T10:32:14.017 に答える