我想过滤掉一些常见路径之后发生的任何事情。例如,打印出每个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
答案 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
demo和regex demo(不是证明)。
POSIX ERE模式详细信息
^
-行首(.*/pytests/|[^/]+/)
-第1组:两种选择之一:
.*/pytests/
-尽可能多的0个字符,然后是/pytests/
个字符串|
-或[^/]+/
-否定的括号表达式,匹配除/
之外的1+个字符,然后匹配/
([^/.]+)
-第2组:与/
和.
以外的1个或多个字符匹配的否定括号表达式.*
-直到行尾的任何0个或更多字符。 {s {1}}字符在sed命令中用作定界符,以免转义具有许多,
字符的模式。