В Bash вы можете использовать
rx='(_GM5)?_(.*)'
Регулярное выражение будет соответствовать необязательной последовательности _GM5
(захватывая ее в группе 1, помните, что синтаксис Bash POSIX ERE не поддерживает не захватывает группы), а затем _
будет сопоставлено, а остальная часть строки будет записана в Группу 2, и вы можете получить это значение, используя ${BASH_REMATCH[2]}
.
См. онлайн Bash демо :
#!/bin/bash
s="123456_GM5_testing.csv
123456_GM5_ekko.csv.json
123456_TN_TECH_CHECK_IMAGES.csv
213456_TN_TECH_CHECK_IMAGES.csv.json"
rx='(_GM5)?_(.*)'
while read -r line
do
if [[ "$line" =~ $rx ]]; then
echo "$line => ${BASH_REMATCH[2]}";
fi;
done <<< "$s"
Вывод:
123456_GM5_testing.csv => testing.csv
123456_GM5_ekko.csv.json => ekko.csv.json
123456_TN_TECH_CHECK_IMAGES.csv => TN_TECH_CHECK_IMAGES.csv
213456_TN_TECH_CHECK_IMAGES.csv.json => TN_TECH_CHECK_IMAGES.csv.json
Если вам нужно решение sed
, используйте
sed 's/^[^_]*\(_GM5\)\{0,1\}_//'
См. это онлайн-демо