2016-07-18 9 views
0

ファイル拡張子を除くすべてのファイルで、_の後に出現する文字を削除するためのunixコマンド/シェルスクリプトを探していました。ファイル拡張子(.png)を除くすべてのファイルから_の後にある文字を削除します

例:

b6d28保険複製-shop_6b5c74fa3d4b96f7557c3fd66f2555af.png

b6d28保険複製-shop.png

に名前を変更する必要があります私はオンラインで検索しようとしましたが、迅速かつ最適なものを見つけることができませんでしたl溶液である。

これらの余分な文字は、ファイルごとにランダムに追加されます。

ありがとうございました!

答えて

1

あなたは否定文字クラスを使用して、このようなsedを使用することができます。

f='b6d28-insurance-renewal-shop_6b5c74fa3d4b96f7557c3fd66f2555af.png' 
sed 's/_[^_.]*//' <<< "$f" 

b6d28-insurance-renewal-shop.png 

[^_.]は、DOTまたはアンダースコア以外の任意の文字に一致します。

あなたがbashを使用しているなら、あなたは使用して、シェル自体にこれを行うことができます:

echo "${f%_*}.png" 
+0

OPは最後にアンダースコアの後に部分的に行動したいと思った。 – anubhava

+1

十分に公正で、私はアンダースコアの後ろにすべてを考えました。ただ1つだけあれば多分問題ではないかもしれないが。 – 123

+1

実際には、OPは、最初または最後のアンダースコアの後にするべきかどうかを示していないので、%%または%のいずれかが解決策になります。 – user1934428

0

正規表現パターン:

(\_[\d\w]+)(?=(\.\w{2,3})) 

を.EXT [ension]

+0

これは、正確に3の長さの拡張機能でのみ機能します – Nidhoegger

0
前にすべての_akfgasfhsgfhhaを見つけるために、

このような結果にはcutを使用することもできます。

file="b6d28-insurance-renewal-shop_6b5c74fa3d4b96f7557c3fd66f2555af.png" 
new_file=$(echo $file | cut -d'_' -f1).$(echo $file | cut -d'.' -f2) 
echo "New file name: ${new_file}" 

出力:

New file name: b6d28-insurance-renewal-shop.png 
0

fは、元のファイル名を保持していると仮定すると、

${f%_*}.${f##*.} 

はあなたに変換されたファイル名を与えるだろう。

関連する問題