複数の検索/置換を使用する ed(1) スクリプト

複数の検索/置換を使用する ed(1) スクリプト

問題を解決する努力中コードゴルフホームページ、簡単なテキストを交換してみてください。

  • 与えられたファイルcoin.txt1つの単語をheads含むtails
  • edスクリプトがありますflip.ed次のように:
s/heads/1/n\
s/tails/-1/n\
wq
.
  • 次に、端末(macos、zsh)で次のように実行します。 (各」エドマスタリー「第111章)
[~/ゴルフ/エド]λエドコイン.txt <フリップキャットコイン.txt;  
6

スクリプトtails-1./bin/edどちら/usr/local/bin/gedも複数の置換を実行できないようです。

これはTIO.runの例、私の考えにはGNUバージョンを実行しているようです。

ed私のスクリプトに問題がありますか?それでもパワーバグed??

修正する

解決策、礼儀@ed1confTwitterで。接頭辞を使用すると、一致する行のみが置き換えられるgため、元のスクリプトを破損するエラーを回避できます。 オンラインでお試しください!

g/heads/s//1/
g/tails/s//-1/
wq
.

ベストアンサー1

これは可能ですが、リダイレクトや通常のファイルを介してコマンドを送信することはできません。

~からGNU編集オンラインマニュアル:

エラーが発生した場合は、edへの入力が通常のファイルまたはhere文書から出た場合は終了し、そうでない場合は「?」を印刷してコマンドモードに戻ります。

ファイル内の単語が両方のパターンと一致しないため、両方のコマンドのいずれかが失敗するため、行1edで一致しないか、行2で一致しないため終了します。それ一致しません(したがって、変更されたファイルを保存する前に終了します)。

これらのコマンドは標準入力(バックスラッシュとサフィックスを除く)を介して機能します。

printf '%s\n' 's/heads/1/' 's/tails/-1/' 'wq' | ed -s coin.txt

?失敗(リダイレクト可能)の結果としてs/heads/1/stderrを受け取りますが、交換はすべて期待どおりに発生します。

終了するのに十分な.ので、末尾のコマンドを削除しました。qed


回避策、出版社:ed(1) Twitter カンファレンス、例:

g/heads/s//1/
g/tails/s//-1/
wq

または、次のセクションに省略形がありませんs///

g/heads/s/heads/1/
g/tails/s/tails/-1/
wq

これらのバリエーションは、g置換が行われなくてもコマンドが失敗しないために機能します。

おすすめ記事