回答:
文字列演算子を使用できます。
$ foo=1:2:3:4:5
$ echo ${foo##*:}
5
これにより、前から「:」まですべてが貪欲にトリミングされます。
${foo <-- from variable foo
## <-- greedy front trim
* <-- matches anything
: <-- until the last ':'
}
${foo%:*}
。#
- 初めから; %
-終わりから。#
、%
-最短一致。##
、%%
-最長一致。
echo ${pwd##*/}
動作しません。
pwd
変数と見なします。お試しくださいdir=$(pwd); echo ${dir##*/}
。私のために働く!
別の方法は、前後を逆にすることcut
です:
$ echo ab:cd:ef | rev | cut -d: -f1 | rev
ef
これにより、最後の1つ以外のフィールド、または末尾から番号が付けられたフィールドの範囲を非常に簡単に取得できます。
echo "1 2 3 4" | rev | cut -d " " -f1 | rev
rev
。cut -b20- | rev | cut -b10- | rev
カットを使用して最後のフィールドを取得することは困難ですが、awkおよびperlでのいくつかの解決策を以下に示します
echo 1:2:3:4:5 | awk -F: '{print $NF}'
echo 1:2:3:4:5 | perl -F: -wane 'print $F[-1]'
/
:文字/a/b/c/d
と/a/b/c/d/
(同じ結果をもたらすd
処理するときに)pwd | awk -F/ '{print $NF}'
。承認された回答の場合、空の結果になります/a/b/c/d/
/
区切り文字として使用します。パスが/my/path/dir/
最後の区切り文字の後に値を使用する場合、これは単に空の文字列です。ですから、私のようにそうする必要がある場合は、スラッシュの末尾を避けるのが最善です。
awk '{$NF=""; print $0}' FS=: OFS=:
が十分に機能することがよくあります。
かなり単純な使用法(たとえば、区切り文字のエスケープなし)を想定すると、grepを使用できます。
$ echo "1:2:3:4:5" | grep -oE "[^:]+$"
5
内訳-行末($)の区切り文字([^:])以外のすべての文字を検索します。-oは、一致する部分のみを印刷します。
一方通行:
var1="1:2:3:4:5"
var2=${var1##*:}
別の、配列を使用して:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
var2=${var2[@]: -1}
さらに別の配列:
var1="1:2:3:4:5"
saveIFS=$IFS
IFS=":"
var2=($var1)
IFS=$saveIFS
count=${#var2[@]}
var2=${var2[$count-1]}
Bash(バージョン> = 3.2)正規表現の使用:
var1="1:2:3:4:5"
[[ $var1 =~ :([^:]*)$ ]]
var2=${BASH_REMATCH[1]}
$ echo "a b c d e" | tr ' ' '\n' | tail -1
e
区切り文字を改行に変換し、で最後のエントリを選択するだけtail -1
です。
\n
が、ほとんどの場合、最も読みやすいソリューションです。
使用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
a
Bashを使用する。
$ var1="1:2:3:4:0"
$ IFS=":"
$ set -- $var1
$ eval echo \$${#}
0
echo ${!#}
代わりに使用できましたeval echo \$${#}
。
Pythonに慣れている人にとっては、https://github.com/Russell91/pythonpyがこの問題を解決するための良い選択です。
$ echo "a:b:c:d:e" | py -x 'x.split(":")[-1]'
pythonpyヘルプから:-x treat each row of stdin as x
。
このツールを使用すると、入力に適用されるPythonコードを簡単に作成できます。
簡単な解決策は入力文字列の順序を逆にすることですが、答えが少し遅れる可能性があります。これにより、長さに関係なく常に最後のアイテムを取得できます。
[chris@desktop bin]$ echo 1:2:3:4:5 | rev | cut -d: -f1
5
ただし、この方法を使用していて、数値が1桁よりも大きい(または状況によっては1文字よりも大きい)場合は、パイプ処理された出力に対して別の 'rev'コマンドを実行する必要があります。
[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
応援よろしくお願いします
Pythonが好きで、パッケージをインストールするオプションがある場合は、このPythonユーティリティを使用できます。
# 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
パッケージの全体的な目的はpython -c
、少ない文字タイプで同じことを行うことです。リポジトリのREADMEをご覧ください。
5
1:2:3:4:5:
/