sed は行の先頭または文字と一致します。

sed は行の先頭または文字と一致します。

コロンで区切られた作業文字列があり、各形式はa=bfooを抽出するために解析する必要があります。ここでfooはです...:di=foo:...。割り当てはdi=foo、文字列の先頭、中間、または末尾で行うことができます。

私の考えは、行の先頭またはコロン、文字列、di=コロンを除くすべての文字、コロン、または行の終わりを一致させることです。

私は「コロンを除くすべての文字」部分だけを機能させました。

いくつかのテスト:

echo "di=a;b:*.di=c;d:ddi=e;f" | sed "s/.*di=\([^:]*\):.*/\1/"
echo "ddi=a;b:di=c;d:*.di=e;f" | sed "s/.*di=\([^:]*\):.*/\1/"
echo "*.di=a;b:ddi=c;d:di=e;f" | sed "s/.*di=\([^:]*\):.*/\1/"

最初の項目も返す必要がありa;b、2番目c;dと3番目の項目も返す必要がありますe;fが、両方とも返されますc;d

ベストアンサー1

私の考えは、行の先頭またはコロンを一致させ、次に文字列di =を一致させ、コロンを除くすべての文字を一致させ、次にコロンまたは行の終わりを一致させることです。

例のように、「次のコロンまたは行末」を一致させる必要はありません。

{
echo "di=a;b:*.di=c;d:ddi=e;f"
echo "ddi=a;b:di=c;d:*.di=e;f"
echo "*.di=a;b:ddi=c;d:di=e;f"
} | sed 's/\(^\|.*:\)di=\([^:]*\).*/\2/'

出力:

a;b
c;d
e;f
  • \(^\|.*:\)行の先頭または後にコロンが続くすべての文字と一致します。

おすすめ記事