ファイル内のすべての行をsedで置換した、行内の最初のパターンの置換


16

1つのライナーでそれを行うことは可能ですか?

私はこのような出力を持っています:

"First line" - Description  
" Second line" - Description  
"Third line" - Description  
" Fourth line" - Description  

この入力は自動的に生成されます。

行ごとに最初に出現する"(引用符+スペース)を"(引用符)に置き換えたい。置換をグローバルに適用すると、line" -toの出現line"-箇所もすべて変更されるので、これを実現するためにsed oneライナーを使用できるかどうか疑問に思いました。

^このように使ってみました

sed -r ':a;N;$!ba;s/(\^\" )/\"/g'

しかし、それは機能しておらず、何も置き換えません。私は試した

sed -r ':a;N;$!ba;s/(^|\" )/\"/g'

そしてそれはすべての出現を置き換えます。私はsedを使い始めたばかりなので、何か間違っているのか本当にわかりません。

ここで何が欠けていますか?


ラベルに関する注意:上記で作成したコマンドは、の一部の実装で機能する可能性がありますsedが、移植性と実際に奇妙なエラーを回避するために、ラベルの後に特定のコマンド引数を終了する必要があります(必要な場合)。例:sed -e ':a' -e 'N;$!ba' -e 'whatever'
ワイルドカード

回答:


34

難しく考えすぎだよ。 sedデフォルトでは(/gモディファイアなしで)行の最初のインスタンスのみを置き換えますが、アンカーは必要ないので、行の最初のインスタンスを行の先頭のインスタンスとしてあまり必要としません。通常、使用しようとしている明示的な行アクションは必要ありません(なぜですか)。

sed 's/^" /"/'

ありがとう!ファイルを操作するときは、行アクションを明示的に宣言し、それについて読んで、そのまま使い続ける必要があると思いました。私は本当にそれを考え

これらのコマンドはかなり時代遅れであると言いたくなります。それらを使用して非常に複雑な複数行の処理を実行することは可能ですが、実行するのは容易ではなく、最近は代わりにperl / python / ruby​​ / whateverを使用する方がベターです。
ギーコサウルス

上記のコメントに完全に同意しない。複数行はsedこのようなコマンドNやラベルなど:aまったく時代遅れではありません、彼らはしているポータブルおよびPOSIXは、指定されたPerl / Pythonの/ルビーとは異なり/何でも、。ただし、頻繁に必要になる場合は、を学ぶawk必要があります。
ワイルドカード

2

私がギークサウルスの答えにコメントすることができないので、より一般的な答え-あなたは^(行頭のアンカー)を入れません。たとえば、Aの最初の出現をBに置き換えたい場合、次のようになります。

sed 's/A/B/'
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.