
У меня есть файл ( *.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
команда, можно описать следующим образом:
-n
не печатать ничего, пока не будет найдено совпадение/rea ses/
рассматривать только те строки, которые соответствуют этому REs!...!...!p
замените RE между первыми двумя восклицательными знаками (!
) на следующую строку, но выведите строку только в случае совпаденияRE-
^.*/\(.*\)\.[^.]*$
матчи- Все до последней черты
/
- Все, начиная с этого момента и до последней точки
.
(запоминается как шаблон\1
) - Все остальное
- Все до последней черты
Замена шаблона, описанного в пункте 4, выполняется с помощью шаблона
\1
, т.е. вашего имени файла без завершающего расширения с точкой.
решение4
basename
Для удаления конечного расширения можно использовать :
cat a4.ses | grep -im1 'rea ses' | awk -F'[/]' '{print $NF}' | xargs basename -s .ses\'
(отправлено для полноты, учитывая ваш процесс, ответ @steeldriver лучше)