[英]How to print character just after a particular character in a string using bash
我有一個像
abc def 0/1 dls dl 9/0 1//o
我想將0
和1
(字符串中第一個/
之后和之前的字符)放入兩個變量中,比如$NUM1
和$NUM2
,並對它們做一些進一步的邏輯。
僅使用shell 參數擴展:
$ str='abc def 0/1 dls dl 9/0 1//o'
$ num1=${str%%/*} # Remove first "/" and everything after it
$ echo "$num1"
abc def 0
$ num1=${num1##* } # Remove last space and everything before it
$ echo "$num1"
0
$ num2=${str#*/} # Remove first "/" and everything before it
$ echo "$num2"
1 dls dl 9/0 1//o
$ num2=${num2%% *} # Remove first space and everything after it
$ echo "$num2"
1
#
, ##
, %
和%%
在這里必須小心使用。 單次重復刪除后面的模式中最短的匹配,重復使用刪除最長的模式匹配。
或者,在第一次擴展后,您只需要字符串的第一個或最后一個字符,這可以通過子字符串擴展來解決:
$ echo "$num1"
abc def 0
$ echo "${num1:(-1)}" # Extract last character
0
$ echo "$num2"
1 dls dl 9/0 1//o
$ echo "${num2:0:1}" # Extract first character
1
負索引至少需要 Bash 4.2。 對於較舊的 Bash 版本,我們可以使用
echo "${num1:${#num1}-1}"
最后,我們可以使用 Bash 正則表達式,如glenn jackman's answer 所示。
您可以使用 bash 正則表達式,它使用捕獲的子表達式填充BASH_REMATCH
數組:
if [[ $a =~ (.)/(.) ]]; then
num1=${BASH_REMATCH[1]}
num2=${BASH_REMATCH[2]}
fi
echo $num1 $num2
0 1
不要養成使用 ALL_CAPS_VARNAMES 的習慣:有一天你會不小心寫到PATH=/my/path
然后想知道為什么你的腳本被破壞了。 為外殼和操作系統保留大寫變量
您可以使用 sed 用正則表達式解析該行以提取數字:
NUM1=$(echo 'abc def 0/1 dls dl 9/0 1//o' | sed 's@[^0-9]*\([0-9]*\)/[0-9]*.*@\1@')
NUM2=$(echo 'abc def 0/1 dls dl 9/0 1//o' | sed 's@[^0-9]*[0-9]*/\([0-9]*\).*@\1@')
echo $NUM1
0
echo $NUM2
1
我假設您是基於空格隱式分隔字符。 因此,您希望字符從空格到第一個 '/' 以及從第一個 '/' 到下一個空格。 我可能會使用 sed:
echo "abc def 0/1 dls dl 9/0 1//o" | sed -r 's%^[^/]* ([^ ]*)/([^ ]*) .*%\1 \2%'
但請注意,如果第一個“/”之前沒有空格,這將不起作用。 您可能希望為這種情況使用另一種模式。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.