sed -r ':a; s/^((([^"]*"){2})*[^"]*"[^" ]*) /\1_/;ta'
4444 username "some_information" "someotherinformation" "even_more_information"
また
sed ':a; s/^\(\(\([^"]*"\)\{2\}\)*[^"]*"[^" ]*\) /\1_/;ta'
4444 username "some_information" "someotherinformation" "even_more_information"
:a- ループのラベル「a」
s///- 置換を実行します
^(- 検索文字列全体を行頭に固定します
(([^"]*"){2})*- (グループ 1 で) ゼロ以上の非引用符の 2 つのセットとそれに続く引用符 (ゼロ回以上) をキャプチャします。
[^"]*"- ゼロ個以上の非引用符が続き、その後に引用符が続きます
[^" ]*- スペースまたは引用符ではない 0 個以上の文字が続く
)- 固定されたシーケンスを終了し、置換に必要なスペースを探します
\1- キャプチャされたグループとアンダースコアを一致したシーケンスに置き換えます
ta- 置換が成功した場合は、ラベルに分岐 (実行を転送) (:aそうでない場合は次の命令に進みます。この場合、この行の処理を終了し、次の命令を読み取り、新しいラウンドの処理を開始します)
これは、引用符で囲まれた最後の文字列でスペースを含む最初のスペースを見つけ、それを置き換えます。次に、もしあれば、その引用符で囲まれた文字列が終了するまで。追加のスペースについても同様です。
次に、スペースを含む次の前の引用符付き文字列...など。
:aこれは、 ...taループの各ステップでパターン スペースがどのように見えるかです。
4444 username "some information" "someotherinformation" "even_more information"
4444 username "some information" "someotherinformation" "even_more_information"
4444 username "some_information" "someotherinformation" "even_more_information"
次に、行の先頭で一致するものを探すために、さらに数回ステップスルーします。