数字の前と下線の後の文字列の抽出

数字の前と下線の後の文字列の抽出

元の文字列は次のとおりです。

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 abcsum 123

おすすめ記事