web-dev-qa-db-ja.com

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

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

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

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

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

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

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

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

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

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

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

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

16
Steve B.

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

sed 's/^" /"/'
34
geekosaur

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

sed 's/A/B/'
2
spectrum