foo
Bashの文字列からコンテンツを抽出しようとしています。"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