3

私が見つけたすべての例は、スクリプトの最後にwコマンドがあることを示しています。sedそれができない場合はどうなりますか?

例はおそらく問題をよりよく示します:

$ echo '123' | sed 'w tempfile; s/[0-9]/\./g'
sed: couldn't open file tempfile; s/[0-9]/\./g: No such file or directory

(どのように)sedファイル名がどこで終わるかがわかるように上記を変更できますか?

PS私は私ができることを知っています

$ echo '123' | sed 'w tempfile
> s/[0-9]/\./g'
...

よりきれいなオプションはありますか?

PPSの人々は、それを2つのスクリプトに分割することを提案する傾向があります。問題は、安全ですか?wコマンドの後でどこかに分岐する場合などはどうなりますか。コマンドの後でスクリプトを2つに分割でき結果に影響しないことを誰かが確認できますか?

最終編集:-e複数が連結コマンドと同じように機能することを確認しました。私はそれがもっと複​​雑だと思いました(最初のものは常に2番目のものが始まる前に終了する必要があるなど)。ただし、コマンドのブロックを2つのスクリプトに分割しようとしました{..}が、それでも機能するため、w実際には深刻な問題ではありません。ありがとうございます。

4

4 に答える 4

4

1 つのシェル行で sed に 2 行のスクリプトを指定できます。

echo '123' | sed -e 'w tempfile' -e 's/[0-9]/\./g'
于 2012-06-22T15:22:38.453 に答える
3

これはあなたのために働くかもしれません(あなたがBASHとおそらくGNU sedを使っているなら):

echo '123' | sed 'w tempfile'$'\n'';s/[0-9]/\./g'

説明:

、およびコマンドrには、ファイル名を終了するための改行が必要です。Rw

于 2012-06-22T16:05:31.920 に答える
2

質問への答えは「改行」です:

sedエスケープされていないリテラル改行をファイル名の末尾として扱います。

シェルがbashであるか、$'\n'構文をサポートしている場合、OPの元の質問を次のように解決できます。

echo '123' | sed 'w tempfile'$'\n''s/[0-9]/\./g'

より限定的shに言えば、

$ echo '123' | sed 'w tempfile'\
> 's/[0-9]/\./g'

私がここで行ったことは\、エスケープとして書いてから、Enter キーを押して残りのコマンドをそこに書き込んだことです。ここで改行をエスケープしていますbashが、に渡されていることに注意してくださいsed

于 2012-06-22T16:24:33.193 に答える
0

次のように 2 つの sed コマンド シーケンスを逆にします。

echo '123' | sed 's/[0-9]/\./g;w tempfile'

つまり、最初に置換を実行してから、パターン スペースをファイルに書き込みます。

編集: OPが最終ファイルのテキストを置き換えたいかどうかについて、誤解がありました。上記のコマンドは、置換されたテキストを一時ファイルに入れます。これはOPがここで望んでいたものではないので、それを回避するもう1つのバージョンがあります:

echo '123' | sed -e 'h;s/[0-9]/\./g;g;w tempfile'
于 2012-06-22T15:28:09.427 に答える