сканирование и grepping

сканирование и grepping

У меня есть файл ( *.ses), который содержит следующую строку

$   rea ses '../../../../abcdefgh/abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'

Когда я использую эту команду:

cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}'

выходной сигнал:

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001.ses'

Я просто хочу, чтобы вывод был таким:

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

без расширения.

Как мне это сделать?

решение1

Если .ses'это статическое расширение, просто жестко закодируйте удаление этих последних 5 символов в awk, выведя строку от начала до 5 символов с конца:

awk -F/ '{print substr($NF, 1, length($NF)-5)}'

Если длина расширения может меняться, то перед печатью замените его пустой строкой:

awk -F/ '{gsub(/\..+$/, "", $NF); print $NF}'

решение2

Если вы grepподдерживаете синтаксис регулярных выражений, совместимый с Perl (PCRE):

$ grep -Po 'rea ses.*/\K[^.]*' file
abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

Объяснение:

  • сопоставить rea sesи затем жадно все до /включительно; затем
  • соответствует самой длинной последовательности символов, не являющихся точками
  • отбросить ( \K) левую часть и вывести только то, что осталось от совпадения ( -o)

решение3

Вы можете отказаться от этого трубопровода и использовать sedвместо него

sed -n '/rea ses/s!^.*/\(.*\)\.[^.]*$!\1!p' a4.ses

Выход

abcd_efgh-A20_ABC-abcdefgh-Abcdefgh_Abcdef_123er_vb001

То, что делает эта sedкоманда, можно описать следующим образом:

  1. -nне печатать ничего, пока не будет найдено совпадение
  2. /rea ses/рассматривать только те строки, которые соответствуют этому RE
  3. s!...!...!pзамените RE между первыми двумя восклицательными знаками ( !) на следующую строку, но выведите строку только в случае совпадения
  4. RE- ^.*/\(.*\)\.[^.]*$матчи

    • Все до последней черты/
    • Все, начиная с этого момента и до последней точки .(запоминается как шаблон \1)
    • Все остальное
  5. Замена шаблона, описанного в пункте 4, выполняется с помощью шаблона \1, т.е. вашего имени файла без завершающего расширения с точкой.

решение4

basenameДля удаления конечного расширения можно использовать :

cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\' 

(отправлено для полноты, учитывая ваш процесс, ответ @steeldriver лучше)

Связанный контент