我们可以使用语法${var##pattern}
和${var%%pattern}
提取 IPv4 地址的最后和第一部分:
IP=109.96.77.15
echo IP: $IP
echo 'Extract the first section using ${var%%pattern}: ' ${IP%%.*}
echo 'Extract the last section using ${var##pattern}: ' ${IP##*.}
Run Code Online (Sandbox Code Playgroud)
我们如何使用参数扩展提取 IPv4 地址的第二或第三部分?
这是我的解决方案:我使用一个数组并更改 IFS 变量。
:~/bin$ IP=109.96.77.15
:~/bin$ IFS=. read -a ArrIP<<<"$IP"
:~/bin$ echo ${ArrIP[1]}
96
:~/bin$ printf "%s\n" "${ArrIP[@]}"
109
96
77
15
Run Code Online (Sandbox Code Playgroud)
此外,我已经写了使用一些解决方案awk
,sed
以及cut
命令。
现在,我的问题是:是否有基于不使用数组和 IFS 更改的参数扩展的更简单的解决方案?
是否可以使用整数随机生成器 $RANDOM 生成具有特定精度和特定范围的真实随机数?例如,我们如何生成介于 0 和 1 之间的 4 个精度的实数?
0.1234
0.0309
0.9001
0.0000
1.0000
Run Code Online (Sandbox Code Playgroud)
一个简单的解决方法:
printf "%d04.%d04\n" $RANDOM $RANDOM
Run Code Online (Sandbox Code Playgroud) 考虑到我们有很多名字像DSC_20170506_170809.JPEG
. 为了重命名照片以使其遵循模式Paris_20170506_170809.JPEG
,我编写了以下完美运行的脚本。
for file in *.JPEG; do mv ${file} ${file/DSC/Paris}; done
Run Code Online (Sandbox Code Playgroud)
我的问题是,我们如何使用while
循环而不是循环来编写此脚本for
?
为什么以下命令打印数值?
$ iostat | sed -n '/[:digit:]/!p'
1.56 1.38 0.31 0.34 0.03 96.38
Run Code Online (Sandbox Code Playgroud) 我想将以下正则表达式与 awk 一起使用来验证电话号码:
echo 012-3456-7890 | awk '/^\(?0[1-9]{2}\)?(| |-|.)[1-9][0-9]{3}( |-|.)[0-9]{4}$/ {print $0}'
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
awk: line 1: regular expression compile failed (missing operand)
Run Code Online (Sandbox Code Playgroud)