単語の最後の文字を削除しますが、その文字がある場合にのみ - bash

単語の最後の文字を削除しますが、その文字がある場合にのみ - bash

最後の文字がある場合にのみどのように削除できますか?

入力する:

オープンオフィス.org/m
openOffice.org/ozm
個人の。
Pfg。
フィル。
教授。
それぞれ。
屋根の長さ/メートル
ローン海峡

希望の出力:

オープンオフィス.org
オープンオフィス.org
パース
プルーガー
フィル
教授
回答
ロンステル
ロンスター

これまではドットだけを残しましたが、残念ながら最後のsedコマンドでは文字も削除されましたg$ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

答え1

コマンドのポイントを超えて、sedすべてがうまくいくでしょう。このように:

sed 's/\.$//'

エスケープしないと、.$文字列の末尾にあるすべての文字と一致するためです。

また、sedすべての++を1つに入れることもできます。grepcutsed

sed 's=/[^/]*$==;s/\.$//' filename

答え2

文字を削除する存在する場合のみパラメータ拡張が正確に説明する内容です。

 $ var=path.
 $ echo "$var    ${var%.}"
 path.    path

この場合、点は特別ではありません(正規表現では点は特別です)。

他のパターンは、次のコマンドを使用して削除できます%/*

 $ var=openOffice.org/ozm
 $ echo "${var%/*}"
 openOffice.org

両方を削除するには:

 $ var=roonstr./ozm
 $ var=${var%/*}
 $ var=${var%.}
 $ echo "$var"
 roonstr

もちろん、ソースファイルを処理するには、そのファイルにsedを使用する方が高速です。
参照点だけを覚えておいてください(文字通り一致、そうでなければすべての文字を意味します)。

 $ sed 's,/.*,,;s,\.$,,' file

答え3

正規表現を少し変更するだけです。脱出する. 必要はありません。grep

cat filename | cut -d"/" -f1 | sed 's/\.$//'

関連情報