Сначала , чтобы включить регулярные выражения, с которыми вы знакомы в sed
, вам необходимо использовать переключатель -r
(sed -r ...):
echo $all_apk_file | sed -r 's/(.*apk ){1}/TEST/g'
# returns TESTy m.apk
Посмотрите, что он возвращает: TESTy m.apk
. Это потому, что .*
является жадным , поэтому он соответствует настолько, насколько это возможно . То есть .*
соответствует a 1 2.apk x
, и вы сказали, что хотите заменить .*apk
, то есть a 1 2.apk x.apk
на 'TEST', что приведет к TESTy m.apk
(обратите внимание на следующий пробел после '.apk' в вашем регулярном выражении, поэтому совпадение не распространяется на последний «.apk», который не имеет пробела после него).
Обычно можно изменить .*
на .*?
, чтобы сделать его нежадным , но это поведение не поддерживается в sed.
Итак, чтобы исправить это, вам просто нужно сделать свое регулярное выражение более строгим.
Трудно сказать, что вы хотите сделать - удалить первые три слова, где третье заканчивается на .apk, и заменить на «ТЕСТ»? В этом случае можно использовать регулярное выражение:
[a-z0-9]+ +[a-z0-9]+ +[a-z0-9]+\.apk
в сочетании с переключателем 'i' (без учета регистра).
Вы должны будете предоставить свою логику для решения, что удалять (первые три слова, любое количество слов до первого слова .apk и т. Д.), Чтобы мы могли помочь вам в дальнейшем с регулярным выражением.
Во-вторых , вы вставили переключатель 'g' в свое регулярное выражение. Это означает, что все совпадающие шаблоны будут заменены, и вы, кажется, хотите, чтобы только первая была заменена. Так что уберите переключатель «g».
Наконец , все это в комбинации:
echo $all_apk_file | sed -r 's/[a-z0-9]+ +[a-z0-9]+ +[a-z0-9]+\.apk/TEST/i'
# TEST x.apk y m.apk