Awk 如何提取一些常见路径之后发生的内容?

Awk 如何提取一些常见路径之后发生的内容?,awk,sed,grep,Awk,Sed,Grep,我想过滤掉在一些公共路径之后发生的任何内容。例如,打印出每个pytests/或src之后出现的下一个单词/ 对于“src/cs测试/测试\u错误检查\u 0001.py” awk-F“/{print$2}”作品 对于“metadata/pytests/ipa-cert.yaml” awk-F“/pytest/“{print$2}”awk-F“{print$1}”很有效 但我想把这些放在一份awk声明中 metadata/pytests/ipa-cert.yaml src/cs-test/test

我想过滤掉在一些公共路径之后发生的任何内容。例如,打印出每个pytests/或src之后出现的下一个单词/

对于“src/cs测试/测试\u错误检查\u 0001.py” awk-F“/{print$2}”作品

对于“metadata/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

sed的设计目的是对单个字符串进行简单的替换。为
-E
使用GNU或OSX/BSD时:

$ sed -E 's:(^|.*/)(pytests|src)/([^/.]+).*:\3:' file
ipa-cert
cs-test
或者,如果出于某种原因确实想使用awk,那么使用GNU awk for gensub():

对于任何awk:

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

sed -E 's,^(.*/pytests/|[^/]+/)([^/.]+).*,\2,' file > newfile
请参阅和(而不是证据)

POSIX ERE图案细节

  • ^
    -行首
  • (.*/pytests/|[^/]+/)
    -第1组:两种备选方案之一:
    • */pytests/
      -尽可能多的任意0+字符,然后
      /pytests/
      字符串
    • |
      -或
    • [^/]+/
      -一个反括号表达式,匹配除
      /
      之外的1+字符,然后是一个
      /
  • ([^/]+)
    -第2组:与
    /
    以外的1个或多个字符相匹配的反括号表达式
  • *
    -线路末端的任何0个或更多字符
字符在sed命令中用作分隔符,以避免过度扩展具有许多
/
字符的模式。

尝试
awk'{print gensub(/^(.*/pytests\/^[^/]+\/)([^/]+./,“\\2”,1)}文件
sed -E 's,^(.*/pytests/|[^/]+/)([^/.]+).*,\2,' file > newfile