文字列からテキストを抽出して変数に保存する

文字列からテキストを抽出して変数に保存する

このような文字列があり、/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 '/' '-');

関連情報