1

別の文字列の前に前の文字列を見つけようとしています。例えば:

StringA <stuff 1>
StringA <stuff 2>
StringD
...
StringB <stuff 3>
StringA <stuff 4>
StringA <stuff 5>
StringA <stuff 6>
StringD
StringB <stuff 7>

ファイル内の StringB の直前にあるすべての「StringA」を見つけたいと思います。

この例の出力は次のようになります。

StringA <stuff 2>
StringA <stuff 6>

次を使用して、すべての StringB の行番号を見つけることができます: grep -n "StringB"

次に、1 行目から StringB の行に移動する sed -n 1,$line_numberp を使用できます。私はgrep "StringA" |を実行します。テール -n1

これは機能しているように見えますが、少し面倒です。望ましい結果を達成するためのより良い方法はありますか?

4

4 に答える 4

3
grep "\(StringA\|StringB\)" $file_name | grep -B 1 StringB | grep StringA
于 2013-04-25T00:45:46.443 に答える
1

awk を使用:

awk '/^StringB/ { if(lastline ~ /^StringA/) {print lastline }} {lastline=$0}' $file

StringA と StringB は正規表現にすることができます。

于 2013-04-25T01:14:44.907 に答える
1
sed '/String[AB]/!d' input | 
   sed -n -e '/StringA/{:l /StringA/h;n;/StringB/{x;p;b};bl}'

コメント付き:

sed '/String[AB]/!d' input |      # remove lines not containing StringA/B
   sed -n -e '/StringA/{          # if line contains StringA, then
      :l                          # loop until StringB
          /StringA/h;             # keep the most recent A in the hold space
          n;                      # read a newline (overwrite pattern space)
          /StringB/!bl;           # loop up...
          x;p;b                   # get the most recent A, and print
   }'
于 2013-04-25T00:45:25.403 に答える
0

これはうまくいくかもしれません(GNU sed):

sed ':a;$!N;/^StringA/!D;/^\(StringA\).*\n\1/D;/.*StringB/!ba;P;D' file

StringAこれにより、最後の行を保持する重複行が削除され、StringB行に遭遇すると、パターン スペース内の最初の文字列が出力されます。

于 2013-04-25T06:01:23.183 に答える