簡體   English   中英

如何使用bash在字符串中的特定字符之后打印字符

[英]How to print character just after a particular character in a string using bash

我有一個像

abc def 0/1 dls dl 9/0 1//o

我想將01 (字符串中第一個/之后和之前的字符)放入兩個變量中,比如$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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM