入力例:
START{
some text
{
more text}
almost there
}
nothing important{
...
希望の出力:
START{
some text
{
more text}
almost there
}
最初の開いたブラケットは別の位置にある可能性があります。
START{...
START {...
START
{...
先頭には特殊文字を含めることもできます。例: *
{}
STARTから始まるすべての内容と最初の一致の間のすべての内容(bash)を印刷したいと思います。私はそれが見つかると増加し{
、見つかると減少するカウンターを持つと思います}
。結果が0の場合は印刷を停止します(中括弧は常に一致します)。
ベストアンサー1
すべてのUnixシステムのすべてのシェルで任意のawkで動作する簡単な無差別方法:
$ cat tst.awk
s=index($0,"START") { $0=substr($0,s); f=1 }
f { rec = rec $0 RS }
END {
len = length(rec)
for (i=1; i<=len; i++) {
char = substr(rec,i,1)
if ( char == "{" ) {
++cnt
}
else if ( char == "}" ) {
if ( --cnt == 0 ) {
print substr(rec,1,i)
exit
}
}
}
}
$ awk -f tst.awk file
START{
some text
{
more text}
almost there
}