いくつかのパターン間でのみいくつかの置換を行いたいとしましょう。それら<a>
を</a>
明確にするために...(大丈夫、大丈夫、彼らはそうです!.. Jeez!start
end
)
したがって、同じ行start
で常に発生する場合の対処方法を知っています。適切な正規表現を設計するだけです。end
また、それらが異なる行にあることが保証されている場合の対処方法も知っており、を含む行に何も気にせず、前end
を含む行にすべてのコマンドを適用しても問題ありません。アドレス範囲を指定するだけです。として。start
start
/start/,/end/
ただし、これはあまり便利ではありません。{...}
たとえば、ブロック内に変更を導入するなど、よりスマートな仕事をする必要がある場合はどうなりますか?
私が考えることができることの1つは、処理前と処理前に入力を分割し、{
後で}
元に戻すことです。
sed 's/{\|}/\n/g' input | sed 'main stuff' | sed ':a $!{N;ba}; s/\n\(}\|{\)\n/\1/g'
別のオプションは反対です:
cat input | tr '\n' '#' | sed 'whatever; s/#/\n/g'
これらは両方とも醜いです。これは主に、操作が1つのコマンドに限定されていないためです。2つ目は、元のテキストに存在しないと仮定して、「改行ホルダー」として文字またはサブストリングを使用する必要があるため、さらに悪化します。
したがって、問題は次のとおりです。より良い方法はありますか、それとも上記の方法を最適化できますか?これは、最近のSOの質問で読んだものからはかなり定期的なタスクなので、ベストプラクティスを一度だけ選択したいと思います。
PS私は主に純粋なsed
ソリューションに興味があります:仕事は1回の呼び出しだけで行うことができsed
ますか?awk
いいえ、などをお願いPerl
します。これは理論的な質問であり、「できるだけ早く仕事をする必要がある」という質問ではありません。