このような文字列があり、/feature/abc-1245_branch_name
文字列からabc-1245を抽出して別の変数に保存しようとしています。
sedを試してみましたが、うまくいきませんでした。
答え1
使用awk
(入力文字列がどれだけ変更されるかに応じて):
awk -F[_/] '{print $3}' <<<"$string"
より複雑なディレクトリ構造を処理するには、デフォルト名を使用して開始できます。
basename "$string" | awk -F_ '{print $1}'
変数に保存して使用するコマンドの置き換え
variable=$(awk -F[_/] '{print $3}' <<<"$string")
答え2
string=/feature/abc-1245_branch_name
different_variable=${string%%_*}
different_variable=${different_variable##*/}
printf '%s\n' "$different_variable"
これは標準引数置換を使用して最初の下線の後のビットを削除し、最後のスラッシュの前のビットを削除します。
${variable%%pattern}
pattern
最も長い部分文字列の一致を削除終わりの$variable
。${variable##pattern}
pattern
最も長い部分文字列の一致を削除スタートの$variable
。
_branch_name
実際に何が起こっているのか分かったら、
string=/feature/abc-1245_branch_name
different_variable=$( basename "$string" '_branch_name' )
printf '%s\n' "$different_variable"
これは、文字列をパス名として処理し(実際のパス名ではない可能性があります)、basename
最後のパスコンポーネント(「ファイル名」など)を取得するために使用されます。このbasename
ユーティリティはファイル名のサフィックスも削除できるため、既知の文字列を削除するためにこのユーティリティを使用します_branch_name
。
答え3
あなたの要件に応じた答えはまだありませんsed
。
$ string="/feature/abc-1245_branch_name"
$ sed -e 's/^.*\///; s/_.*$//' <<<"$string"
abc-1245
@jesse_bが提案したように、コマンド置換を使用して結果を変数に入れます。
$ result=$(sed -e 's/^.*\///; s/_.*$//' <<<"$string")
$ echo $result
abc-1245
ただし、文字列がより複雑になり、解析と解析/フィルタリングモードがある文字列から別の文字列に変更されない限り、@kusalanandaの純粋なBashソリューションを使用してください。これは私がここでやっているのと同じことをしますsed
。つまり、貪欲なパターンマッチングですが、この単純なケースでは、純粋なBashはおそらく「自然な」選択でしょう。
答え4
私はgrepを試してみました、それはうまく機能し、非常に簡単です。
$(echo "feature/ABC-BranchName" | grep -Eo 'develop|release|((feature|bugfix|hotfix)/ABC-)([0-9]+)' |tr '/' '-');