私はthis型の文字列構造を持ってbob-type-8.2-mp2-2017-93-43-11-65-48.spr
います8.2-mp2-2017-93-43-11-65-48
。
これは、出力文字列に最初の数値が見つかった後にその値から削除された後のすべての文字を含める必要があることを意味します.spr
。
どうすればいいですか?
答え1
この試み:
echo "bob-type-8.2-mp2-2017-93-43-11-65-48.spr" | sed 's/^[^0-9]*//;s/\.[^.]*$//'
出力は次のとおりです。
8.2-mp2-2017-93-43-11-65-48
説明する:
sedはパターンを使用してパターンを見つけs/pattern/replace_pattern/'
てpattern
置き換えます。replace_pattern
したがって、パターンは's/^[^0-9]*//'
行の先頭と最初の数字が表示される前のすべての記号を取得し、null(replace_pattern
空)に置き換えます。
次のステップ - 拡張機能を削除します。同じsedパターンを使用してこれを実行できます's///'
。
s/\.[^.]*$//
.
- aで終わらない記号をすべて探し、$
何もない記号に置き換えます。
;
- 分割モード。
より良い理解のために、次のコマンドを使用できます。
echo "bob-type-8.2-mp2-2017-93-43-11-65-48.spr" | sed -e 's/^[^0-9]*//' -e 's/\.[^.]*$//'
答え2
バッシュではextglob
:
$ shopt -s extglob
$ var=bob-type-8.2-mp2-2017-93-43-11-65-48.spr
$ res=${var##*([^0-9])}
$ res=${res%.spr}
$ echo "$res"
8.2-mp2-2017-93-43-11-65-48
*([^0-9])
数値以外のすべての文字列と一致し、${var##pattern}
文字列の先頭から最も長い一致パターンを削除し、${var%pattern}
最後から(最も短い)一致パターンを削除します。
答え3
もう一つの方法はですsed
。
sed 's/^[^[[:digit:]]*\(.*\)\.spr$/\1/' <<<"bob-type-8.2-mp2-2017-93-43-11-65-48.spr"
^[^[[:digit:]]*
文字列の先頭から最初の数字が表示されるまで、すべての項目と一致します。^[^0-9]*
\(.*\)
上記の一致以降のすべての項目と一致し、\(...\)
キャプチャグループの一致には括弧が使用されます\1
。逆参照。\.spr$
spr
入力文字列の末尾のリテラルポイントと一致します。\1
キャプチャされたグループ一致のみが印刷されます。
答え4
POSIX的に:
string=bob-type-8.2-mp2-2017-93-43-11-65-48.spr
newstring=${string#"${string%%[0-9]*}"}
newstring=${newstring%.*}
${string#pattern}
:$string
一致するコンテンツを最初から削除しますpattern
。この場合:${string%%[0-9]*}
$string
[0-9]*
パターンに一致する最も長い末尾の部分を削除します。最初の数字の前半です。${newstring%.*}
:$string
それを奪われた最短パターンと一致する末尾の部分です.*
。したがって、拡張機能を削除してください。
そしてzsh
:
newstring=${(M)${string:r}%%[0-9]*}
${string:r}
: 次に展開ルート名(拡張子を削除)csh
${(M)var%%pattern}
、M
演算子が追加した内容を返します%%
(そうでない場合は、(M)
POSIXシェルのパターンと一致する末尾から最も長い部分が削除されます)。