[英]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.