gnu sed пытается использовать оператор ИЛИ с группами, но не работает

Этот скрипт создает new_file_b.txt.

Использование:./script.sh file_a.txt file_b.txt > new_file_b.txt

#!/bin/bash

awk '
/Recommended Weight: /{
    value=$3;
}
NR != FNR {
    if($1 == "WGHT") {
        print $1 OFS value; 
    } else {
        print;
    }
}
' "$1" "$2"
0
04.10.2019, 18:51
1 ответ

\2 указывает на печать второго совпадения, если ваша цель — напечатать :my-team(, неясно из вашего вопроса ), вы можете сделать это:

echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\
 gsed "s/origin.*bitbucket.org\(:.*\)\/.*/\1/"

Чтобы по-прежнему совпадать в случае наличия :или /, вы можете использовать группы, не соответствующие -. Вместо (<regex>)они записываются как(:?<regex>):

echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\ 
gsed -r "s/origin.*bitbucket.org(:?:|\/)(.*)\/.*/\2/"

Это даст my-teamдля обоих:

  • 'происхождение git@bitbucket.org :моя -команда/myrepo.git (выборка )'
  • 'происхождение git@bitbucket.org/my -team/myrepo.git (выборка )'

Я думаю, что путаница возникает из-за того, что в sed для разделения команды вы можете использовать любой символ (часто вы будете видеть / )это требует, чтобы вы экранировали этот символ в регулярном выражении. Так что если вы не в курсе этого непонятно чего бежать. Если вы используете ,вместо /, этот символ не нужно экранировать :

.
echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\
 sed -r "s,origin.*bitbucket.org(:?:|/)(.*)\/.*,\2,"

И вам на самом деле не нужен :?, если вы уверены, что один из двух символов(:или/)всегда будет присутствовать.

1
28.04.2021, 23:28

Теги

Похожие вопросы