1

例えば:

((

extract everything here, ignore the rest

))

内部のすべてを無視する方法は知っていますが、その逆を行う方法はわかりません。基本的に、それはファイルになり、2 点間のデータを抽出して別のファイルに出力する必要があります。私は数え切れないほどのアプローチを試しましたが、私が述べているインデントがファイルに存在しないことを教えてくれるようです。

誰かが私を正しい方向に向けることができれば、私は感謝します.

4

4 に答える 4

2

データが「行指向」であり、マーカーが (例のように) 単独である場合は、次のいくつかを試すことができます。

function getdata() {
    cat - <<EOF
before
((
    extract everything here, ignore the rest
    someother text
))
after
EOF
}

echo "sed - with two seds"
getdata | sed -n '/((/,/))/p' | sed '1d;$d'

echo "Another sed solution"
getdata | sed -n '1,/((/d; /))/,$d;p'

echo "With GNU sed"
getdata | gsed -n '/((/{:a;n;/))/b;p;ba}'

echo "With perl"
getdata | perl -0777 -pe "s/.*\(\(\s*\\n(.*)?\)\).*/\$1/s"

Ps: はい、クレイジーな爪楊枝のダンスのように見えます

于 2013-04-20T21:19:01.797 に答える
1

(( と )) 内の文字列を抽出するとします。

VAR="abc((def))ghi"
echo "$VAR"
VAR=${VAR##*((}
VAR=${VAR%%))*}
echo "$VAR"

##最初から最も長い文字列を切り取ります。#最初から最も短い文字列を切り取ります。%%最後に最も長い文字列を切り取ります。%最後にショーツの紐を切り落とします

于 2013-04-20T20:58:31.023 に答える
0

sed -n '/^((/,/^))/ { /^((/b; /^))/b; p }'

簡単な説明:

/^((/,/^))/: range addressing (inclusive)
{ /^((/b; /^))/b; p }: sequence of 3 commands
                       1. skip line with ^((
                       2. skip line with ^))
                       3. print

範囲選択を排他的にするには、行スキップが必要です。

于 2013-04-20T21:29:25.237 に答える
0

ファイル :

$ cat /tmp/l
((
    extract everything here, ignore the rest
    someother text
))

スクリプト

$ awk '$1=="((" {p=1;next} $1=="))" {p=o;next} p' /tmp/l
    extract everything here, ignore the rest
    someother text
于 2013-04-20T20:51:16.610 に答える