sed
のAPIはプリミティブです-これは仕様によるものです。少なくとも、それは残っています設計上原始的ます-私が言うことができない初期に原始的に設計されたかどうか。ほとんどの場合、sed
実行時に別のsed
スクリプトを出力するスクリプトを書くことは、本当に簡単なことです。および/またはsed
などのマクロプリプロセッサによって、この方法で非常に頻繁に適用されます。m4
make
(以下は非常に仮説的なユースケースです。それはソリューションに合うように設計された問題です。それがあなたにとってストレッチのように思えるのであれば、それはおそらくそれが理由です。
次の入力ファイルを検討してください。
cat <<"" >./infile
camel
cat dog camel
dog cat
switch
upper
lower
上記の入力ファイルの適切な各単語の末尾に-caseをsed
追加するスクリプトを記述したい場合は、適切なコンテキストの、できるだけ効率的に実行したい(たとえば、コンパイル操作中の目標であるように)、/
regexp /
を可能な限り適用しないようにする必要があります。
できることの1つは、システム上でファイルを事前に編集し、sed
コンパイル中にまったく呼び出しないことです。しかし、ファイル内のこれらの単語のいずれかをローカル設定および/またはコンパイル時オプションに基づいて含める必要がある場合、または含めない場合、そうすることは望ましい代替手段ではない可能性があります。
私たちがするかもしれないもう一つは、ファイルを処理することです 今、正規表現に対して。sed
行番号に従って編集を適用できるスクリプトを作成し、コンパイルに含めることができます。これは通常、長期的にははるかに効率的なルートです。
例えば:
n=$(printf '\\\n\t')
grep -En 'camel|upper|lower' <infile |
sed " 1i${n%?}#!/usr/heirloom/bin/posix2001/sed -nf
s/[^:]*/:&$n&!n;&!b&$n&/;s/://2;\$a${n%?}q"'
s/ *cat/!/g;s/ *dog/!/g
s| *\([cul][^ ]*\).*|s/.*/\1-case/p|'
...出力をaの形式で書き込みます sed
スクリプト次のようになります...
#!/usr/heirloom/bin/posix2001/sed -nf
:1
1!n;1!b1
1s/.*/camel-case/p
:2
2!n;2!b2
2!!s/.*/camel-case/p
:5
5!n;5!b5
5s/.*/upper-case/p
:6
6!n;6!b6
6s/.*/lower-case/p
q
その出力が私のマシン上の実行可能なテキストファイルに保存され、の./bang.sed
よう./bang.sed ./infile
に実行されると、出力は次のようになります。
camel-case
upper-case
lower-case
今、あなたは私に尋ねるかもしれません... なぜ私はそれをしたいのですか?なぜアンカーgrep
の一致だけではないのですか?とにかくラクダケースを使用するのは誰ですか?そして、それぞれの質問に答えることしかできませんでした。私はしませんので。この質問を読む前に、私は個人的にマルチに気づいていませんでした!仕様の解析要件-私はそれがかなりきちんとしたキャッチだと思います。
マルチ!事はなかったすぐにかかわらず、私には意味をなさない-の多くのsed
仕様は、単に解析され、単純に向けている生成され sed
たスクリプト。あなたはおそらく、そのコンテキストではるかに意味\n
を[wr:bt{]
なすために必要なewline区切り文字を見つけるでしょう、そしてその考えを覚えておけば、仕様の他のいくつかの側面をよりよく理解するかもしれません- (:
アドレスを受け入れない、q
に拒否します1)以上を受け入れます。
例では、私は、特定の形式に書き出すの上にsed
できるだけでスクリプト今までに一度読むことを。それをよく見るsed
と、編集ファイルを読み込むと、コマンドブロックから次のコマンドブロックに進むことに気付くかもしれません。
私はそのマルチを検討します!アドレスは他のいくつかのコンテキストよりもそのコンテキストでより有用かもしれませんが、正直なところ、私はそれを非常に有効に使用したかもしれない単一のケースを考えることはできません-そして私sed
はたくさん。また、GNU / BSD sed
の両方が指定どおりに処理できないことは注目に値すると思います-これはおそらく要求の多い仕様の一部ではないため、実装を見落とすと、バグ@ボックスが非常に深刻になることを疑います結果としてひどく。
それは言った、指定されたとして、これを処理するために、障害があるコンプライアンスたふりを任意の実装のバグ、と私は呼ば-のためにされてここでは関係のdevのボックスに電子メールを撮影し、そうでない場合、私はそうするつもりだと思うので。
!
では、トグルとして機能/pattern/!!
し/pattern/
、と同じであり、と/pattern/!!!
同じ/pattern/!
です。FreeBSDでは、複数!
は単一のものと同じです。