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"
次に、行の先頭で一致するものを探すために、さらに数回ステップスルーします。