Bash - Sürekli Dize Manipülasyonu


11
#!/bin/bash

FILE="$(basename "$1")"
FILE="${FILE/%.jpeg/.jpg}"

Bu iki çizgiyi tek bir astar halinde yapıştırmak için yine de var mı?

Yanıtlar:


12

FILE=$(basename "${1/%.jpeg/.jpg}") benim için çalıştı.

Ölçek:

bash-$ ./test.sh /tmp/foo.jpeg
foo.jpg

script içeriği:

bash-$ cat test.sh 
#!/usr/bin/bash

FILE=$(basename "${1/%.jpeg/.jpg}")

echo "$FILE"

İki çizgi birbirinin yerine geçebileceğinden, bu çözüm şimdiye kadar en iyisidir ... Eğer hatlar birbirinin yerine sedkullanılamazsa kesinlikle gerekli olacaktır.
gsklee

11

Bash (veya ksh, kül ve zsh dışında diğer kabuklarda) genişletmeleri yuvalayamazsınız. Bu sadece kozmetik bir sınırlamadır, çünkü gösterdiğiniz gibi geçici bir değişkene bir ara ifade atayabilirsiniz. Tek satırlar için biraz can sıkıcıdır, ancak komut dosyalarında okunabilirlik için tartışmasız daha iyidir.

Harici yardımcı programı basenamekullanmaktan kaçınabilir ve bunun yerine bir dize düzenleme yapısı kullanabilirsiniz:

FILE="${1##*/}"; FILE="${FILE/%.jpeg/.jpg}"

Burada, komut değiştirme işlemini dışarıya koymak için komut dosyanızı yeniden yazabilirsiniz . Bu genel bir fenomen değil, belirli bir tek katmanlı duygudan başka bir şey kazanmıyorsunuz.

Zsh, daha iyisi ya da daha kötüsü, genişlemeleri iç içe geçirmenize izin veriyor:

FILE=${$(basename $1)/%.jpeg/.jpg}    # using basename
FILE=${${1##*/}/%.jpeg/.jpg}          # using string rewriting

Veya aşağıdakiler yerine zsh'ın yerleşik yapısını kullanabilirsiniz basename:

FILE=${${1:t}/%.jpeg/.jpg}

4

Ben giderdim:

FILE=$(basename $1 .jpeg).jpg

Basename için ikinci parametre, dosya adından kaldırılacak bir sonektir (bkz. man basename)


3

sedAşağıdaki gibi tek bir komut kullanabilirsiniz :

FILE=$(sed 's/.*\///;s/\.jpeg$/.jpg/' <<<"$1")

2

Dahil etmek sed, hile yapmalıdır:

FILE="$(basename "$1" | sed s/\.jpeg$/.jpg/)"

(Bu sorunuzu tam olarak cevaplamıyor çünkü yapamıyorum; mümkün olup olmadığından emin değilim.)


1

Bash ${}yapıları değişken adlarıyla çalışır , bu nedenle doğrudan bir komut yerleştirmenin yolu yoktur. Ekstra çatalı sakıncası yoksa @ sr_'nin yaklaşımı bir alternatiftir.


1

Çizgi

FILE=$(basename "${1/%.jpeg/.jpg}")

ile kısaltılabilir ve daha taşınabilir hale getirilebilir

FILE=$(basename "${1%.jpeg}.jpg")
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.