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


12

最後の文字がある場合にのみそれを削除する方法は?

入力:

OpenOffice.org/m
openOffice.org/ozm
パース。
Pfg。
フィル。
教授
それぞれ。
Roonstr./m
roonstr./ozm

望ましい出力:

OpenOffice.org
openOffice.org
パース
製造
フィル
教授
応答
Roonstr
roonstr

これまでのところ、ドットだけが残っていることがわかりましたが、残念ながら最後のsedコマンドも文字を削除しgます。 $ cat filename | grep "\." | cut -d"/" -f1 | sed 's/.$//'

回答:


12

sedコマンドでドットをエスケープするだけで、すべてがうまくいきます。このような:

sed 's/\.$//'

エスケープしない場合.$、文字列の最後の任意の文字に一致します。

また、すべてのsed+ grep+ cutを1つにまとめることもできますsed

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

ありがとうございます。:) 300k行を超える辞書を使用しているため、これがgrep "\"を使用する理由です。そこにドットのある単語のみを取得します。
removelastdotonlyifitsthere

sedは、次のようなsmthでもそれを実行できます sed -n '/\./{s=/[^/]*$==;s/\.$//;p}。とにかくgrep+ sedは1つよりもずっと長く機能しsedます。
ラッシュ

1つのsedでそれを行うことができれば、それでもいいでしょう。最後のsedコマンドを適用する方法は?
removelastdotonlyifitsthere

sed 's/[./]\+[^./]*$//'
Peter.O

おかげで私はカットする必要はありませんが、grepはまだ残っています。私のパイプされたgrepコマンドのsed相当物は、それからgrepを削除します。可能であれば、それは素晴らしいでしょう。「また、すべてのsed + grep + cutを1つのsedに入れることもできます」は機能しません。すべての単語を出力しますか?
removelastdotonlyifitsthere

1

文字が存在する場合にのみ、文字を削除します。これは、パラメーター展開の説明とまったく同じです。

 $ 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

これは受け入れられる答えになるはずです。さらに賛成票が必要です。
デビッドパークス

0

正規表現を少しだけ変更してください:エスケープ. するには、必要ありませんgrep

cat filename | cut -d"/" -f1 | sed 's/\.$//'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.