問題を解決する努力中コードゴルフホームページ、簡単なテキストを交換してみてください。
- 与えられたファイル
coin.txt
1つの単語を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を受け取りますが、交換はすべて期待どおりに発生します。
終了するのに十分な.
ので、末尾のコマンドを削除しました。q
ed
回避策、出版社: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
置換が行われなくてもコマンドが失敗しないために機能します。
答え2
それでsed
あなたはこれを行うことができます
sed 's/heads/tails/;t;s/tails/heads/'
では、ed
そのt
コマンドはまったく異なるコマンドであり、「最も最近の代替エントリがアクションを実行している場合は分岐」されません。
GNUを使用すると、ed
次のことができます。
printf '%s\n' '1s/heads/T/' '1s/tails/H/' '1s/H/heads/' '1s/T/tails/' 'wq' | ed -s coin.txt
ただし、BSD では、一致ed
しない最初の置換でコマンド処理が停止するため、機能しない可能性があります。
入力スクリプトでエラーが発生した場合、ファイルにデータが存在しない場合、または外部条件(読み取りまたは書き込みエラーなど)によってエラーが検出された場合:
標準入力が端末装置ファイルの場合は、すべての入力をフラッシュして新しいコマンドを読み取る必要があります。
標準入力が一般ファイルの場合は、
ed
ゼロ以外の終了状態で終了する必要があります。
(その言葉はPOSIX規格)
このスクリプトを実行したときにGNUから受け取ったエラーは、ed
「不一致」エラー(H
スクリプトにコマンドを最初に挿入したときに表示される)なので、無視してもかまいません。