2016-11-07 20 views
-1

入力データ(ファイル名)を除い:「一致」の各一致最終

Word1.Word2 Word3.ext 
Word1.Word2 Word3.Word4.ext 
Word1 Word2.Word2.ext 
Word1 Word2.Word3 Word4.ext 

.extは、ファイルの種類によって異なり、単語はスペースまたはで区切られ、「」

所望の出力:

s/\\.//

と私は私が最後得ることができます知っている: ''

Word1 Word2 Word3.ext 
Word1 Word2 Word3 Word4.ext 
Word1 Word2 Word3.ext 
Word1 Word2 Word3 Word4.ext 

は私がのすべての発生を置き換えることができます知っています。拡張子は:

(.[^\\.]*)$ 

ですが、どのように一緒に参加するのか分かりません。

答えて

0

ここには拡張に依存しない方法があります

sed 'h;s/.*\(\.[^.]*\)/\1/;x;s/\.[^.]*$//;s/\./ /g;G;s/\n//' 

コマンドは、セミコロンで分離し、これを行うされています:

  • hコピーホールドスペースにライン、私たちが働きながら、元のテキストを保存し、
  • 正規表現、ちょうど株式sedを編sは、最後のドットと拡張子を除くすべてを削除します。.*はできるだけ多くの行を取り込めるほど貪欲であるため、正規表現にドル記号は必要ありません。
  • xスワップこのドットおよび拡張我々はホールドスペースに保存された元の行と、
  • sは、元の行から最後のドットと拡張子を削除し、
  • sは(スペースを持つすべての残りのドットを置き換え、 g修飾子は、
  • G
  • は改行)で区切っ我々はドットなしのライン上にホールドスペースに保存されたドットと、拡張子を追加します(ただし、
  • をそれらのすべて)、単に最初ではないに置き換える意味し、 sはその厄介な改行を削除します。あなたのオリジナルのポストについて

ワンノート:あなたの期間のための正規表現と拡張、あなたは

(.[^\\.]*)$ 

として示し、角​​括弧の外

\.[^.]*$ 

する必要があり、ピリオドは任意の文字に一致します。したがって、ピリオドに一致させたい場合は、ピリオドをバックスラッシュでエスケープする必要があります。しかし角括弧の中では、ピリオドにのみ一致します。一致した文字列をキャプチャしない限り、括弧を削除することができます。

+0

ありがとうございます。それは私にとって完璧です。 []についてのメモをありがとう。 – Lorccan

0

perl先読み正規表現使用してそれを行うことが容易である:

perl -pe 's/\.(?=.*\.[^.]*$)/ $1/g' file 

Word1 Word2 Word3.ext 
Word1 Word2 Word3.Word4.ext 
Word1 Word2 Word2.ext 
Word1 Word2 Word3 Word4.ext 

さもないと、このawkのコマンドを使用します。あなたが使用だけにしてsedを使用する必要がある場合

awk -F '.' '{$(NF-1) = $(NF-1) "." $NF; NF--} 1' file 

Word1 Word2 Word3.ext 
Word1 Word2 Word3 Word4.ext 
Word1 Word2 Word2.ext 
Word1 Word2 Word3 Word4.ext 

を:

sed ':a 
s/\.\([^.]*\.\)/ \1/g 
ta' file 

Word1 Word2 Word3.ext 
Word1 Word2 Word3 Word4.ext 
Word1 Word2 Word2.ext 
Word1 Word2 Word3 Word4.ext 
+0

うわー!早かった。ありがとうございました。私は間違ったものをキー入力しているかどうか分かりませんが、2行目と4行目にはまだまだ奇妙な点があります:Word1 Word2 Word3.Word4 extとWord1 Word2.Word3 Word4.ext – Lorccan

+0

ありがとう。私は彼らが働いていると確信していますが、私は本当に可能ならsedの解決策を探していました。 (私は本当に正規表現の部分のハングを取得しようとしています!) – Lorccan

+0

応答ありがとう。私は非拡張バージョンが私のために最善の働きをしていることを発見しました。 – Lorccan

0

以下REが見つかっ:

  • 検索を。
  • 何もドットはありません。
  • find。再び
  • 何も点滅しません。
  • EOL
\.([^\\.]*\.[^\\.]*)$ 

グループ大手以外のすべて "" 次に「$ 1」に置き換えます

関連する問題