![sedを使用して、ファイル内のすべての行に対して、行内のパターンの最初の出現を置換する](https://rvso.com/image/22256/sed%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%80%81%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%AE%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E8%A1%8C%E3%81%AB%E5%AF%BE%E3%81%97%E3%81%A6%E3%80%81%E8%A1%8C%E5%86%85%E3%81%AE%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3%E3%81%AE%E6%9C%80%E5%88%9D%E3%81%AE%E5%87%BA%E7%8F%BE%E3%82%92%E7%BD%AE%E6%8F%9B%E3%81%99%E3%82%8B.png)
ワンライナーで実行することは可能ですか?
出力は次のようになります:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
この入力は自動的に生成されます。
各行で最初に出現する"
(引用符 + スペース) を (引用符) に置き換えたいです。置換をグローバルに適用すると、のすべての出現も に変更されるため、これを実現するために sed ワンライナーを使用できるかどうか疑問に思っています。"
line" -
line"-
^
私はこのように使ってみました
sed -r ':a;N;$!ba;s/(\^\" )/\"/g'
しかし、それは機能せず、何も置き換えません。私は試しました
sed -r ':a;N;$!ba;s/(^|\" )/\"/g'
そして、すべての出現箇所を置き換えます。私は sed を使い始めたばかりなので、何か間違っているのかどうかはよくわかりません。
ここで何が欠けているのでしょうか?
答え1
考えすぎです。 sed
デフォルトでは行の最初のインスタンスのみを置き換えます (修飾子なし/g
)。ただし、行の最初のインスタンスではなく行の先頭のインスタンスが必要なため、アンカーを設定する必要があります。また、通常は、使用しようとしている明示的な行アクションは必要ありません (なぜでしょうか)。
sed 's/^" /"/'
答え2
geekosaurさんの回答にはコメントできないので、もっと一般的な回答をします。^(行頭アンカー)は入れないはずです。例えば、最初のAをBに置き換えたい場合、
sed 's/A/B/'
答え3
使用パール
~$ perl -pe 's/^" /"/;' file
使用楽(旧称 Perl_6)
~$ raku -pe 's/^\" \s /"/;' file
サンプル入力:
"First line" - Description
" Second line" - Description
"Third line" - Description
" Fourth line" - Description
サンプル出力(両方のコード例):
"First line" - Description
"Second line" - Description
"Third line" - Description
"Fourth line" - Description
翻訳元:
https://perldoc.perl.org/perltrap#Sed-トラップ
https://docs.raku.org/language/regexes