Этот скрипт создает 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"
\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
для обоих:
Я думаю, что путаница возникает из-за того, что в sed для разделения команды вы можете использовать любой символ (часто вы будете видеть / )это требует, чтобы вы экранировали этот символ в регулярном выражении. Так что если вы не в курсе этого непонятно чего бежать. Если вы используете ,
вместо /
, этот символ не нужно экранировать :
echo 'origin git@bitbucket.org:my-team/myrepo.git (fetch)' |\
sed -r "s,origin.*bitbucket.org(:?:|/)(.*)\/.*,\2,"
И вам на самом деле не нужен :?
, если вы уверены, что один из двух символов(:
или/
)всегда будет присутствовать.