回答:
awk -v n=3 '/<Car>/ && !--n {getline; print; exit}'
または:
awk '/<Car>/ && ++n == 3 {getline; print; exit}'
検索パターンを変数として渡すには:
var='<car>'
PATTERN="$var" awk -v n=3 '
$0 ~ ENVIRON["PATTERN"] && ++n == 3 {getline; print; exit}'
ここでENVIRON
は、-v
asの代わりに使用すると、-v
バックスラッシュエスケープシーケンスとバックスラッシュが正規表現でよく見られます(したがって、で二重にする必要があります-v
)。
GNU awk
4.2以降では、変数を厳密に型指定された正規表現として割り当てることができます。POSIXモードが有効になっていない限り(たとえば、$POSIXLY_CORRECT
環境変数を介して)、次のことができます。
# GNU awk 4.2 or above only, when not in POSIX mode
gawk -v n=3 -v pattern="@/$var/" '
$0 ~ pattern && ++n == 3 {getline; print; exit}'
これがperlのものです:
perl -ne 'print && exit if $c==3; $c++ if /<Car>/;' file
GNU grep
では、次のようにその出力を解析することもできます。
grep -A 1 -m 3 '<Car>' file | tail -n 1
からman grep
:
-A NUM, --after-context=NUM
Print NUM lines of trailing context after matching lines.
Places a line containing a group separator (--) between
contiguous groups of matches.
-m NUM, --max-count=NUM
Stop reading a file after NUM matching lines.
ここに別の方法がありsed
ます:
sed -n '/<Car>/{x;/.\{2\}/{x;$!{n;p};q};s/.*/&./;x}' infile
これはカウントにホールドスペースを使用しています。
たびにそれが一致する行遭遇した<Car>
ことが電子x
正確に存在する場合、変更バッファとチェックをN-1保持バッファ内の文字の出現を。チェックが成功した場合はx
再度変更され、最後の行にない場合はn
ext行をp
取り込み、パターンスペースをq
リントしてからuitします。それ以外の場合.
は、ホールドスペースに別の文字が追加され、e x
が元に戻ります。
sed
、awk
、あるいはgrep
、それがXMLパーサを利用することをお勧めします。