Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex grep模式从文件中排除负数_Regex_Bash_Shell_Grep - Fatal编程技术网

Regex grep模式从文件中排除负数

Regex grep模式从文件中排除负数,regex,bash,shell,grep,Regex,Bash,Shell,Grep,我一直在努力寻找一个更简单的答案来解决这个问题。但是仍然使用grep 我想grep出myfile.dat的正数(和负数)。Myfile.dat如下所示: -1.4987 4.1354 -8.1235 4.2322 -0.9842 -2.6845 3.6845 1.5132 -2.8452 0.0122 9.3542 -1.2354 -7.2127 -1.1253 -4.3967 0.3535 7.2416 -3.1277 不需要保留列格式。 因此,我使用了以下grep模式 负数

我一直在努力寻找一个更简单的答案来解决这个问题。但是仍然使用grep

我想grep出myfile.dat的正数(和负数)。Myfile.dat如下所示:

-1.4987 4.1354  -8.1235
4.2322  -0.9842 -2.6845
3.6845  1.5132  -2.8452
0.0122  9.3542  -1.2354
-7.2127 -1.1253 -4.3967
0.3535  7.2416  -3.1277
不需要保留列格式。 因此,我使用了以下grep模式

负数:

grep -E -o [-][0-9]+.[0-9]+ myfile.dat
 grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file
sed "s/-[0-9.]*//g; s/^ //" myfile.dat
正数(这里我必须将所有数字输入另一个grep):

问题来了! 是否有一种grep模式允许我直接提取正数,而无需使用第二个grep命令


这是关于模式的,而不是我是否可以使用另一个命令。

使用
grep-p
您可以这样做来获得所有正数:

grep -E -o [-][0-9]+.[0-9]+ myfile.dat
 grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file
sed "s/-[0-9.]*//g; s/^ //" myfile.dat

grep-oP'(?您可以在行首或数字前的空格处进行匹配:

$ grep -oE '(^| )[0-9]+\.[0-9]+' Myfile.dat | tr -d ' '
4.1354
4.2322
3.6845
1.5132
0.0122
9.3542
0.3535
7.2416

tr-d'
只从输出中删除任何初始空格,如果不需要,可以跳过它。

如果要保留列格式,可以使用BASH
read
循环

循环遍历每行的数组,检查并取消设置负元素

while read -a n; do
    for i in ${!n[@]}; do
        if [[ ${n[$i]} =~ ^- ]]; then
            unset n[$i]
        fi
    done
    if [[ -n $n ]]; then
        echo ${n[@]}
    fi
done < myfile.dat
读取时执行 对于${!n[@]};do中的i 如果[${n[$i]}=~^-];那么 未设置的n[$i] fi 完成 如果[[-n$n]];则 echo${n[@]} fi 完成
你能用sed代替grep吗? 删除负数:

grep -E -o [-][0-9]+.[0-9]+ myfile.dat
 grep -oP '(?<!-)\b[0-9]+\.[0-9]+\b' file
sed "s/-[0-9.]*//g; s/^ //" myfile.dat
删除减号后面的数字和点的每个序列
s/-[0-9.]*//g
。 为了美化环境,请删除任何可能保留的前导空格

只保留正数有点棘手

sed "s/^[0-9.]*//; s/ [0-9.]*/ /g; s/^ *//" myfile.dat
删除行首的数字和点
s/^[0-9.]*/
。 替换一个空白,接着是数字和点,只使用空白<代码> s[0~9] *//g < /代码>。最后再次美化,以删除行“代码> S/^*//< /代码>开头的任何剩余的空白。
(可能有一种更简单的方法,但目前还看不到。)

好的,已经提供了sed、grep和纯shell的解决方案,我给出了awk。事实上,我没有得到提供的答案,当问题是关于计算时,为什么要使用一些不适合计算的工具

 awk '{for (i=1;i<=NF;i++) if ($i>=0) print $i} ' file
awk'{for(i=1;i=0)print$i}文件

考虑编辑您的问题,以包括预期输出与当前输出。好的第一个问题+1。祝大家好运。