Awk 如何提取一些常见路径之后发生的内容?
我想过滤掉在一些公共路径之后发生的任何内容。例如,打印出每个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声明中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
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图案细节
-行首^
-第1组:两种备选方案之一:(.*/pytests/|[^/]+/)
-尽可能多的任意0+字符,然后*/pytests/
字符串/pytests/
-或|
-一个反括号表达式,匹配除[^/]+/
之外的1+字符,然后是一个/
/
-第2组:与([^/]+)
和/
以外的1个或多个字符相匹配的反括号表达式
-线路末端的任何0个或更多字符*
,
字符在sed命令中用作分隔符,以避免过度扩展具有许多/
字符的模式。尝试awk'{print gensub(/^(.*/pytests\/^[^/]+\/)([^/]+./,“\\2”,1)}文件
sed -E 's,^(.*/pytests/|[^/]+/)([^/.]+).*,\2,' file > newfile