Как извлечь что-то происходящее после некоторых общих путей? - PullRequest
1 голос
/ 21 июня 2019

Я хочу отфильтровать все, что происходит после некоторых общих путей.Пример: распечатать следующее слово, которое встречается после каждого тестирования / ИЛИ после src /

для "src / cs-test / test_bugcheck_0001.py" awk -F "/" '{print $ 2}' works

для "метаданных / 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 ]

1 голос
/ 21 июня 2019

Я предлагаю использовать

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

См. онлайн sed демо и регулярное выражение (не доказательство).

Детали шаблона POSIX ERE

  • ^ - начало строки
  • (.*/pytests/|[^/]+/) - Группа 1: любой из двух вариантов:
    • .*/pytests/ - любые 0+ символов как можно больше, а затем /pytests/ string
    • | - или
    • [^/]+/ - выражение в отрицательной скобке, соответствующее 1+ символам, отличным от /, а затем /
  • ([^/.]+) - Группа 2: выражение с отрицательной скобкой, соответствующее 1 или более символам, отличным от / и .
  • .* - любые 0 или более символов до конца строки.

Символы , используются в качестве команды-разделителя в качестве разделителя, чтобы не переопределять шаблон, содержащий много символов /.

1 голос
/ 21 июня 2019

Простые замены на отдельные строки - это то, для чего предназначен sed.С GNU или OSX / BSD sed для -E:

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

или если вы действительно хотите по какой-то причине использовать awk, тогда с GNU awk для gensub ():

$ 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...