sedスクリプトでgroupコマンドを使用するときに範囲の最初の行と最後の行を参照する方法はありますか?
範囲の最初の行と最後の行とその間で選択した行を印刷したいと思います。
#n
/StartLinePattern/,/EndLinePattern/{
/PatternOfSubLineToPrint/p;
}
他のグループ化コマンドを含めると、この問題を解決できることがわかります。マッチ範囲の最初と最後の行(再度)グループ化されていないコマンド標準と同様の操作を実行する方がクリーンで高速で、再利用が可能です。
1p;$p
上記をグループに含めようとしましたが、うまくいきませんでした。1
それは$
あなたが属する範囲に関係なく絶対的なようです。
背景
XMLファイル内の要素をフィルタリングするためのsedスクリプトを作成しました。これを行うには、グループコマンドとともに範囲を使用して、範囲内の特定の子要素を印刷します。したがって、スクリプトは保持したいすべての項目を印刷することで動作します。
#n
/<Parent\>/,<\/Parent>/{
/<Child1\>/,/<\/Child1>/p;
/<Child2\>/,/<\/Child2>/p;
/<SingleLineChild\>/p;
}
答え1
以下を使用してこれを実行できます。空の正規表現つまり、//
開始後の最初の正規表現として、たとえば、次のように{
入力します。
hello
world
start
inner1
inner2
inner3
end
outer
走れば
sed -n '/start/,/end/{
//p
/inner1/p;/inner3/p
}' infile
それは印刷する
start
inner1
inner3
end
あなたは見ることができますどのように動作しますか?...重要な部分だけを再公開します。
aがREGEX
空の場合(たとえば、//
)、最後に適用された最後のコマンドで使用された最後のコマンドを指定するのとsed
同じですREGEX
(アドレスまたは代替コマンドの一部として)。
範囲の開始または終了を除外するには、別のテストを追加するだけです。
sed -n '/start/,/end/{
//{
/start/!p
}
/inner1/p;/inner3/p
}' infile