Bashの「foo-bar-baz」から「foo」を抽出する方法は? [コピー]

Bashの「foo-bar-baz」から「foo」を抽出する方法は? [コピー]

fooBashの文字列からコンテンツを抽出しようとしています。"foo-bar-baz"

文字列置換または類似の機能(外部ツールなし)を使用してこれを行う方法についてのアイデアはありますか?

私は成功せずにこれを試しました。

$ str="foo-bar-baz"
$ echo ${str%-*}
foo-bar

これも機能しません。

$ str="foo-bar-baz"
$ echo ${str#*-}
bar-baz

定義を取得する方法についてのアイデアはありますかbar

答え1

$ str="foo-bar-baz"

$ echo "${str%%-*}"
foo

$ echo "${str##*-}"
baz

$ var="${str#*-}"
$ echo "$var"
bar-baz
$ echo "${var%-*}"
bar

答え2

文字列からfooを抽出できます。

$ str="foo-bar-baz"
str= ${str%-*} #this will get the part foo-bar
str= ${str%-*} #this will fetch foo from the string foo-bar
echo $str

答え3

@heemaylはすでに正解を提示していますが、参照と説明を追加するには:

からman bash

   ${parameter%word}
   ${parameter%%word}
          Remove matching suffix pattern.  The word is expanded to produce a pattern just  as  in  pathname  expansion.   If  the  pattern
          matches a trailing portion of the expanded value of parameter, then the result of the expansion is the expanded value of parame-
          ter with the shortest matching pattern (the ‘‘%’’ case) or the longest matching pattern (the ‘‘%%’’ case) deleted.

1 つのシンボルのみが使用されるため、最長一致ではなく%最短一致が削除されます。

参考までに、私は最近勉強していて、一般的にテキスト処理をしていないbash人がawk最終的にテキスト処理をしているという非常に正確な観察を読んでいます。bash完全に誤ったツール。私は約5時間(夕方と朝)の間に90%awk(高度な機能を除くすべての機能)を学びました。

あなたがやっていることが、ファイル名やコマンドパラメータなどで使用するためにこの文字列を削除するだけであれば、もちろん大丈夫です。これがまさにこの機能が存在する理由ですbash。しかし、より高度で複雑な文字列ジャグリングを実行する場合は、高い一日ほど勉強することをお勧めしますawk。数十倍の成果を収めます。

awk(私はあなたのラベルが文字列ジャグリングよりも役に立つと思うので、これに主に言及します。)bash

関連情報