テキストファイル内の引用符の間の1つまたは2つのスペースを置き換える方法

テキストファイル内の引用符の間の1つまたは2つのスペースを置き換える方法

一部のフィールドが引用符で囲まれたCSVファイルがあり、引用符内の項目は二重スペースまたは単一スペースで区切られています。カンマに置き換える必要があります。

例示ライン:

This is okay,"ABC DEF GHI",123,"This is not okay",remove,spaces,within,quotes

そしてそれはどのように見えるべきですか:

This is okay,"ABC,DEF,GHI",123,"This,is,not,okay",remove,spaces,within,quotes

ベストアンサー1

perl -pe 's/".*?"/do{$a = $&; $a =~ s: +:,:g; $a}/ge;'

基本的にこれは単なるグローバル正規表現の置換ですs/regex/replacement/g。正規表現は、".*?"次から始まり終わるすべての部分文字列と一致することです。トリッキーな部分は次のとおりです。""

  • 置き換えられるのは、文字列ではなく計算された式です。 (これはe次の修飾子の意味ですg。)
  • s:regex:replacement:g評価された式は、空でない空白シーケンスをコンマで置き換えるグローバル正規表現の置換です。 (外部置換と同じ区切り文字を使用できないため、代わりに:使用します/。)
  • 内部正規表現置換を実行するには、外部置換の一致する部分文字列を$&別の変数に割り当ててから、$a内部置換を実行して$a最後に印刷する必要があります$a

まったく新しいバージョンの Perl では、補助変数への割り当てを避けることができます。修飾子を使用すると、一致する部分r文字列のコピーから直接内部置換を実行できます$&(Stéphane Chazelasのおかげで)。

perl -pe 's/".*?"/$&=~s: +:,:gr/ge;'

おすすめ記事