Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
Unix 使用sed忽略行中的特定模式_Unix_Sed_Grep - Fatal编程技术网

Unix 使用sed忽略行中的特定模式

Unix 使用sed忽略行中的特定模式,unix,sed,grep,Unix,Sed,Grep,我正在尝试grep这个单词,它在给定的行中以group关键字开头,以-wx结尾。我也需要忽略下面的单词 以default:group开始,以-wx结束 组::-wx 我的发现 echo "# file: /test/test123 # owner: own # group: acct user::r-- group::r-x mask::rwx other::r-x default:user::r-- default:user:an:--x default:group::r-x default

我正在尝试grep这个单词,它在给定的行中以
group
关键字开头,以
-wx
结尾。我也需要忽略下面的单词

  • default:group
    开始,以
    -wx
    结束
  • 组::-wx
  • 我的发现

    echo "# file: /test/test123 # owner: own # group: acct user::r--  group::r-x mask::rwx other::r-x default:user::r-- default:user:an:--x default:group::r-x default:group:fin:-wx default:mask::rwx default:other::r-x" | grep -o "group:[^ ]*-wx" | sed '/group::-wx/d';'/default:[^ ]*:[^ ]*-wx/d'
    
    实际结果

    fin:-wx
    
    预期结果

    <null>
    

    您已经有了一个grep来选择您想要的内容,只需添加grep语句即可删除您不想要的内容

    像这样:

    LINE="# file: /test/test123 # owner: own # group: acct user::r--  group::r-x mask::rwx other::r-x default:user::r-- default:user:an:--x default:group::r-x default:group:fin:-wx default:mask::rwx default:other::r-x"
    
    echo $LINE | grep -o "group:[^ ]*-wx" \
               | grep -vo "default:group:[^ ]*-wx" \
               | grep -vo "group::-wx"
    

    在我的linux上,它什么也不返回,这是您所期望的。我没有其他测试样本,但我认为这是可以的。

    因为您首先从中提取子字符串
    组:fin:-wx
    default:group:fin:-wx
    带有
    grep
    ,下面是
    sed
    过滤器
    /default:[^]*:[^]*-wx/d
    不再工作

    解决方法是更改过滤顺序:

    str="# file: /test/test123 # owner: own # group: acct user::r--  group::r-x mask::rwx other::r-x default:user::r-- default:user:an:--x default:group::r-x default:group:fin:-wx default:mask::rwx default:other::r-x"
    echo "$str" | sed -e 's/default:group:[^ ]*-wx//' -e 's/group::-wx//' | grep -o 'group:[^ ]*-wx'
    
    作为替代方案,如果您的
    grep
    支持
    -p
    选项,则您可以使用
    正向查找
    作为:

    echo "$str" | grep -Po '(?<= )group:[^ ]*-wx' | sed -e '/group::-wx/d' -e '/default:[^ ]*:[^ ]*-wx/d'
    

    echo“$str”| grep-Po'(?这是您输入的预期格式吗?@mnestorov:是的,如果您只在
    grep-o”组:[^]*-wx前面放一个空格,它不会也起作用吗?”
    ,因为在
    组之前我们不想要任何东西,所以你可以尝试。看起来很有希望,我没有对输入进行太多分析。OP应该指定空格是否可以是制表符。例如,这样就不起作用了。但我们没有那种详细程度。它确实起作用,但你指出是否会有制表符或spac是正确的或我们不知道的任何其他细节。