我有这个shell脚本变量, var 。它保留3个以新行分隔的条目。从此变量 var ,我想提取 2 和 0.078688 。只是这两个数字。
var="USER_ID=2
# 0.078688
Suhas"
这些是我试过的代码:
echo "$var" | grep -o -P '(?<=\=).*(?=\n)' # For extracting 2
echo "$var" | awk -v FS="(# |\n)" '{print $2}' # For extracting 0.078688
以上都没有工作。这里有什么问题?如何解决这个问题?
答案 0 :(得分:5)
只需使用tr
来保留数字,点(.
)和空格,然后删除其他所有内容。
tr -cd '0-9. ' <<<"$var"
2 0.078688
man
页tr
-c
页面-d
,IFS=' ' read -r var1 var2 < <(tr -cd '0-9. ' <<<"$var")
printf "%s\n" "$var1"
2
printf "%s\n" "$var2"
2
0.078688
标志的使用
tr [OPTION] ... SET1 [SET2]
-c,-C, - 补充 使用SET1的补充
-d, - 删除 删除SET1中的字符,不要翻译
将其存储在变量
中IFS=' ' read -ra numArray < <(tr -cd '0-9. ' <<<"$var")
printf "%s\n" "${numArray[@]}"
2
0.078688
或者在数组中
-cd
注意: - tr
中的POSIX
标记符合tr
标准,适用于安装了public static void main(String[] args) {
CopyOnWriteArrayList<Integer> list = new CopyOnWriteArrayList();
for (int i = 0; i < 10; i++) {
list.add(i);
}
for (Integer num : list) {
if (num % 2 == 0) {
list.add(num * 100);
}
}
System.out.println("list = " + list);
}
的任何系统。
答案 1 :(得分:2)
echo "$var" |grep -oP 'USER_ID=\K.*'
2
echo "$var" |grep -oP '# \K.*'
0.078688
您的解决方案接近完美,您需要偶然\n
到$
代表行尾。
echo "$var" |awk -F'# ' '/#/{print $2}'
0.078688
echo "$var" |awk -F'=' '/USER_ID/{print $2}'
2
答案 2 :(得分:1)
你可以使用正则表达式使用纯bash来实现:
#!/bin/bash
var="USER_ID=2
# 0.078688
Suhas"
[[ ${var} =~ =([0-9]+).*#[[:space:]]([0-9\.]+) ]] && result1="${BASH_REMATCH[1]}" && result2="${BASH_REMATCH[2]}"
echo "${result1}"
echo "${result2}"
答案 3 :(得分:0)
使用awk:
第一个值:
echo "$var" | grep 'USER_ID' | awk -F "=" '{print $2}'
第二个值:
echo "$var" | grep '#' | awk '{print $2}'
答案 4 :(得分:0)
假设这是作为样本的数据格式
# For extracting 2
echo "$var" | sed -e '/.*=/!d' -e 's///'
echo "$var" | awk -F '=' 'NR==1{ print $2}'
# For extracting 0.078688
echo "$var" | sed -e '/.*#[[:blank:]]*/!d' -e 's///'
echo "$var" | awk -F '#' 'NR==2{ print $2}'