Unix 使用sed忽略行中的特定模式
我正在尝试grep这个单词,它在给定的行中以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
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是正确的或我们不知道的任何其他细节。