如何提取某些常见路径后发生的事情?

时间:2019-06-21 13:10:38

标签: awk sed grep

我想过滤掉一些常见路径之后发生的任何事情。例如,打印出每个pytests /或src /

之后出现的下一个单词

用于“ src / cs-test / test_bugcheck_0001.py” awk -F“ /”'{print $ 2}'有效

“元数据/pytests/ipa-cert.yaml” awk -F“ / pytest /”'{print $ 2}'| awk -F“。 “ {print $ 1}”有效

但是我想在一个awk语句中包含这些内容。

metadata/pytests/ipa-cert.yaml
src/cs-test/test_bugcheck_0001.py

预期结果:

ipa-cert
cs-test

2 个答案:

答案 0 :(得分:1)

sed旨在对单个字符串进行简单替换。使用-E的GNU或OSX / BSD:

$ sed -E 's:(^|.*/)(pytests|src)/([^/.]+).*:\3:' file
ipa-cert
cs-test

或者如果您出于某些原因真的想使用awk,请对gensub()使用GNU awk:

$ awk '{print gensub(/(^|.*\/)(pytests|src)\/([^/.]+).*/,"\\3",1)}' file
ipa-cert
cs-test

以及任何awk:

$ awk 'match($0,/(^|.*\/)(pytests|src)\/[^/.]+/){$0=substr($0,1,RLENGTH); sub(/.*\//,"")} 1' file
ipa-cert
cs-test

答案 1 :(得分:1)

我建议使用

sed -E 's,^(.*/pytests/|[^/]+/)([^/.]+).*,\2,' file > newfile

请参见online sed demoregex demo(不是证明)。

POSIX ERE模式详细信息

  • ^-行首
  • (.*/pytests/|[^/]+/)-第1组:两种选择之一:
    • .*/pytests/-尽可能多的0个字符,然后是/pytests/个字符串
    • |-或
    • [^/]+/-否定的括号表达式,匹配除/之外的1+个字符,然后匹配/
  • ([^/.]+)-第2组:与/.以外的1个或多个字符匹配的否定括号表达式
  • .*-直到行尾的任何0个或更多字符。

{s {1}}字符在sed命令中用作定界符,以免转义具有许多,字符的模式。