各行に1〜n回表示される文字列部分を抽出する必要があります。
たとえば、これは私に必要なものを反映しています。
This [dbo].[something] is a text containing [dbo].[something_else], then okay?
And then, [dbo].[something] may appear just once.
But why, nothing prevents [dbo].[something] from appearing twice as [dbo].[something] here.
And then can be three times, as [dbo].[something] is [dbo].[anything] but [dbo].[elsewhere] here.
[dbo].[otherthing] depicts another scenario with just one and pattern heading line
Or, also [dbo].[ultra] with an arbitrary amount of [dbo].[references] but ending with [dbo].[pattern]
\[dbo\]\.\[[^]]+\]
たとえば、上記のテキストでは、次のような結果が必要です。
something something_else
something
something something
something anything elsewhere
otherthing
ultra references pattern
その後、すべてをインライン化したり、bash配列に追加したり、重複した項目をフィルタリングしたりできます。これは問題ではありません。 1回のスキャンでこのフィルタを実行する方法を特定するのに問題があります。
ここで私が得たのは、最後の一致だけを抽出することです(パターン一致に対するsedの「欲張りな」アプローチに慣れているのであれば、これがなぜそうなのかは明らかです)。
cat dborefs.txt | sed -E "s/(.*\[dbo\]\.\[([^]]+)\].*)*/\2/g"
something_else
something
something
elsewhere
otherthing
pattern
パターンを抽出して置き換えることで、一致しなくなり、一致しなくなるまで再抽出できますが、すべてのbashオーバーヘッドを考慮すると、あまりにも多くの問題のように聞こえます。すべてを一つに抽出できればいいでしょう。呼ぶsed
。これが可能でなければならないと思いますが、どうすればよいかわかりません。私はこれが他の人に役立つと思ったので、コミュニティでこの質問をここで共有することが有益であると感じました。
ベストアンサー1
改行で区切られたトークン文字列のリストを取得するには、次のようにします。
$ grep -o '\[dbo\]\.\[[^]]*\]' file | cut -d . -f 2 | tr -d '[]'
something
something_else
something
something
something
something
anything
elsewhere
otherthing
ultra
references
pattern
最初はgrep
ビットを生成し[dbo].[word]
、その合計を削除cut
します。[word]
tr
[
]
トークン文字列を発生する行ごとにグループ化するには、次のようにします。
$ sed -e 's/\][^.[]*\[/] [/g' -e 's/^[^[]*//' -e 's/[^]]*$//' -e 's/\[dbo\]\.\[\([^]]*\)\]/\1/g' file
something something_else
something
something something
something anything elsewhere
otherthing
ultra references pattern
ここで使用される4つの代替は次のとおりです。
]
点や記号ではなく、間の[
すべての項目を削除します[
(実際には空白に置き換えます。これは最終出力の空白です)。- 最初のものより前のすべてを削除してください
[
。 - 最後のもの以降のすべてを削除してください
]
。 - 残りのコンテンツからタグ付けされた単語を抽出します。