Yanıtlar:
Dize işleçlerini kullanabilirsiniz :
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
Bu, her şeyi önden ':' şeklinde, açgözlülükle keser.
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
. #
- başlangıçtan itibaren; %
- Sondan. #
, %
- en kısa eşleşme; ##
, %%
- en uzun eşleşme.
echo ${pwd##*/}
çalışmıyor.
pwd
bir değişken olarak görür . Deneyin dir=$(pwd); echo ${dir##*/}
. Benim için çalışıyor!
Başka bir yol, önce ve sonra tersine çevirmektir cut
:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
Bu, sondan bir alanın veya sondan numaralandırılan herhangi bir alanın alınmasını kolaylaştırır.
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
, tam da ihtiyacım olan şeydi! cut -b20- | rev | cut -b10- | rev
Kesim kullanarak son alanı elde etmek zor, ama burada awk ve perl'de bazı çözümler var
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
karakteri içeren veya içermeyen yollarla da eşleşir : /a/b/c/d
ve işlerken /a/b/c/d/
aynı sonucu verir ( d
) pwd | awk -F/ '{print $NF}'
. Kabul edilen cevap boş bir sonuç ile sonuçlanır/a/b/c/d/
/
sınırlayıcı olarak kullanır ve yolunuz ise /my/path/dir/
son sınırlayıcıdan sonra değeri kullanır, bu da boş bir dizedir. Bu yüzden benim gibi bir şey yapmanız gerekiyorsa, eğik çizgiden kaçınmak en iyisidir.
awk '{$NF=""; print $0}' FS=: OFS=:
genellikle yeterince iyi çalışıyor.
Oldukça basit kullanım varsayarsak (örneğin, sınırlayıcıdan kaçmaz), grep'i kullanabilirsiniz:
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
Arıza - satır sonunda sınırlayıcı ([^:]) olmayan tüm karakterleri ($) bulun. -o sadece eşleşen parçayı yazdırır.
Tek yön:
var1="1:2:3:4:5"
var2=${var1##*:}
Başka bir dizi kullanarak:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
Yine bir dizi ile:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
Bash (sürüm> = 3.2) normal ifadelerini kullanma:
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
Sınırlayıcıyı yeni bir satıra çevirin ve ile son girişi seçin tail -1
.
\n
, ancak çoğu durumda en okunabilir çözümdür.
Kullanma sed
:
$ echo '1:2:3:4:5' | sed 's/.*://' # => 5
$ echo '' | sed 's/.*://' # => (empty)
$ echo ':' | sed 's/.*://' # => (empty)
$ echo ':b' | sed 's/.*://' # => b
$ echo '::c' | sed 's/.*://' # => c
$ echo 'a' | sed 's/.*://' # => a
$ echo 'a:' | sed 's/.*://' # => (empty)
$ echo 'a:b' | sed 's/.*://' # => b
$ echo 'a::c' | sed 's/.*://' # => c
Son alanınız tek bir karakterse bunu yapabilirsiniz:
a="1:2:3:4:5"
echo ${a: -1}
echo ${a:(-1)}
Bash'de dize manipülasyonunu kontrol edin .
a
değil, son alan .
Burada birçok iyi cevap var, ama yine de bunu basename kullanarak paylaşmak istiyorum :
basename $(echo "a:b:c:d:e" | tr ':' '/')
Ancak dizenizde zaten '/' varsa başarısız olur . Eğer eğik çizgi / sınırlayıcınızsa, sadece basename kullanmanız gerekir (ve kullanmalısınız).
Bu en iyi yanıt değil, ancak bash komutlarını kullanarak nasıl yaratıcı olabileceğinizi gösteriyor.
Bash kullanma.
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
echo ${!#}
Bunun yerine kullanılmış olabilirdi eval echo \$${#}
.
for x in `echo $str | tr ";" "\n"`; do echo $x; done
Python ile rahat olanlar için, https://github.com/Russell91/pythonpy bu sorunu çözmek için iyi bir seçimdir.
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
Pythonpy yardım Gönderen: -x treat each row of stdin as x
.
Bu araçla, girdiye uygulanan python kodunu yazmak kolaydır.
Basit bir çözüm giriş dizesinin sırasını tersine çevirmek olsa da cevapla biraz geç olabilir. Bu, uzunluğu ne olursa olsun her zaman son öğeyi elde etmenizi sağlar.
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
Bununla birlikte, bu yöntemi kullanırken ve sayılar 1 basamaktan büyükse (veya her durumda bir karakterden büyükse), borulu çıkış üzerinde başka bir 'rev' komutu çalıştırmanız gerekeceğini unutmayın.
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1
42
[chris@desktop bin]$ echo 1:2:3:4:5:8:24 | rev | cut -d: -f1 | rev
24
Umarım yardımcı olabilirim, şerefe
Python'u seviyorsanız ve bir paket kurma seçeneğiniz varsa, bu python yardımcı programını kullanabilirsiniz .
# install pythonp
pythonp -m pip install pythonp
echo "1:2:3:4:5" | pythonp "l.split(':')[-1]"
5
echo "1:2:3:4:5" | python -c "import sys; print(list(sys.stdin)[0].split(':')[-1])"
pythonp
Paketinpython -c
daha az karakter yazımıyla aynı şeyleri yapmanızı sağlamaktır. Lütfen depodaki README'ye bir göz atın.
5
dize ise de döner1:2:3:4:5:
(dize işleçlerini kullanırken boş bir sonuç verir). Bu, özellikle bir bitiş/
karakteri içeren (veya içermeyen) yolları ayrıştırırken kullanışlıdır .