0

既知の区切り文字{}によってグループ化された大きなテキストファイルがたくさんあります。ブロックにxyqなどの特定のシーケンスが含まれている場合は、ブロック全体を出力します。

grepを記述して検索タグを取得できることはわかっていますが、選択範囲を最も近い囲み括弧に拡張するにはどうすればよいですか?{と}はどこにでも配置できます。つまり、行の始点や終点、空白などはありません。

このようなものを探しています:

Input:
 {i am a turtle}
 {i am a horse}
 {i am a programmer}

grep ???programmer??? ./File

output: {i am a programmer}
4

3 に答える 3

1

最初に改行を別のものに変換してみることができます。入力に ​​NUL がないと仮定すると、それは良い候補です。

cat input | tr '\n' '\0' | grep -aEo '\{.*?programmer.*?\}' | tr '\0' '\n'

正規表現自体では、?s は以前の一致を非貪欲にします。これは、それらが最長ではなく可能な限り短いシーケンスに一致することを意味します。検索語が中括弧の外にある可能性がある場合、これは正しく機能せず、より明確にする必要があることに注意してください。

cat input | tr '\n' '\0' | grep -aEo '\{[^{}]*programmer[^{}]*\}' | tr '\0' '\n'
于 2012-05-15T22:05:12.403 に答える
0
>cat file
 {i am a turtle}
  jay   {i am a horse}
     {i am a programmer}



>grep horse file | awk -F"{}" '{print substr($2,0,length($2)-1)}'



 i am a horse
于 2012-05-16T13:02:39.743 に答える
0
sed -n '/{\|}/ !{H; b}; /{/ {h; b open}; :open {/}/ b close; n; H; b open}; :close {g; /programmer/ p}' File

説明:

$ sed -n '#suppress printing of all input
> /{\|}/ !{H; b} # if no curly brackets on the line, append it to hold space and finish
> /{/ {h; b open} # if an opening { is found, copy the line to hold space and branch to label :open
> :open
> /}/ b close # if a } is matched, branch to label close
> n; H; b open # else read a new line, append it to hold space and go back to :open
> :close
> g # put all hold space to pattern space
> /programmer/ p # if _programmer_ matches, print the pattern space' File
于 2012-05-16T12:41:25.160 に答える