6

私はこのようなテキストファイルを持っています:

      125
      126
      127    {
      566
      567
      568
      569       # blah blah
      570    {  #blah blah
      700
      701    {

数字は左揃えで、パターンは増加するという意味で常に同じであり、最後に中括弧があります。開始番号だけをキャッチする必要があります。中括弧は常に検出され、シーケンスの終わりに限定されます。ファイルの開始'125'で始まる図のようになります。

要するに私は必要です:

      125
      566
      700

私が思いついたもの:

      grep -A1 '{' | grep -v '{' | grep -oE '(^[0-9]+?)'

しかし、これは「125」を省略しますが、先頭に改行を追加して。を挿入することで克服しました{

これを単一の正規表現に減らしたいと思います。

提案とより良いアルゴリズムは大歓迎です

4

6 に答える 6

4
awk 'BEGIN {p=1} p==1 {print $1;p=0} $0~/{/ {p=1}'

Output:
125
566
700

上記のファイル形式を考えると、 awk と変数/フラグを使用して、開始を見つけたときに追跡できます{

于 2012-07-10T12:45:53.237 に答える
3
sed -n '1p;/{/{
N
s/.*\n\([0-9]\+\).*/\1/p
}' input_file
于 2012-07-10T12:43:45.760 に答える
2

正規表現を微調整する必要があるかもしれませんが、次のとおりです。

awk '!k; { k = !/^ *[0-9]* *{/ }'

これにより、最初の行と、正規表現に一致する行に続く行が出力され^ *[0-9]* *{ ます。おそらく物事を単純化して実行できます。

awk '!k;{k=$2!="{"}'

これは、最初の行と、2 番目のフィールドが単一の左中括弧である行に続く行を出力します。

于 2012-07-10T12:44:17.247 に答える
1

sedコードゴルフ大会で優勝します =) :

sed -n '1p;/{/{n;p}' file

番号の使用後にすべてを削除するには:

sed -n '1{s/\s*\([0-9]\+\).*/\1/;p};/{/{n;s/\s*\([0-9]\+\).*/\1/;p}' file
于 2012-07-10T12:53:39.853 に答える
1

awk とフラグを使用して中括弧の存在をキャプチャし、次の行を出力します。最初にフラグを設定すると、最初の行が得られます。

テストされていませんが、次のようなものです:

BEGIN {hasCurly = 1}
{ 
    if(hasCurly) 
        print $1;

    hasCurly = match($2,"^\{");
}
于 2012-07-10T12:41:01.740 に答える
1

純粋な bash ソリューションは次のとおりです。

start=1
while read n rest; do
    if (( start )); then
        printf '%d\n' $n
        start=0
    elif [[ $rest = \{* ]]; then
        start=1
    fi
done < input
于 2012-07-10T12:48:41.327 に答える