元の文字列は次のとおりです。
str-str001-002_01
str-str005-006_05
数字の前と下線の後の文字列を抽出したいので、
str-str_01
str-str_05
sedがパターンを次のグループに分けることができたことを覚えています。
sed -n 's/\(^.*\)\([0-9]-[0-9]\)\(.*$\)/\1\3/p'
しかし、次のように印刷されます。
str-str0002_01
それから[0-9]が数字だけであることを覚えて、+記号や*記号を使ってみました。その後、空の結果を提供します。
PS:使用して
echo 'str-str001-002_01' | sed -n 's/\(^.*\)\([0-9]-[0-9]\)\(.*$\)/\2/p'
一致すると見られます1-0
。
その後、次のことを試しました。
echo 'str-str001-002_01' | sed -n 's/\(^.*\)\([0-9]\+-[0-9]\+\)\(.*$\)/\2/p'
最初の2桁だけを残して一致します。
1-002
それでは、どのように一致させますか?001-002
ベストアンサー1
これにより、希望の出力が提供されます。
sed -nE 's/^([^0-9]*).*_([^_]+)$/\1_\2/p'
例の出力
str-str_01
str-str_05
説明する
sed -nE 's/…/…/p'
- EREを使用し、一致しない限り行を印刷しないでください。^
- 行の先頭に固定([^0-9]*)
- できるだけ長くパターンを一致させる。つまり、数字以外の文字は少なくとも1つ必要です。.*_
- できるだけ一致します(一致するものは含まれません)。その後に「_
」が続きます。([^_]+)
- 下線ではなく、可能な限り長いパターンと一致します(最小文字)。$
- ラインの最後までアンカー\1_\2
- 行全体を最初の(…)
一致項目 "_
"と2番目の(…)
一致項目に置き換えます。
あなたの試みが期待どおりに機能しないのは、(*
および+
)が貪欲だからです。以前の原子に一致するできるだけ多くの文字を消費します。したがって、(.*)([0-9]+)
同様のEREに適用されたEREの場合、消費されてマッチが残りますabc123
。 「必要です。.*
abc12
[0-9]+
3
数字ではありません"最初の一致に制限:([^0-9]*)([0-9]+)
get abc
sum 123
。