最初の数行には、次のCSVがあります。
c("4288", "57534"),MIB1
c("2272", "2385"),FHIT
c("5550", "10531", "56239"),PREP
c("25809", "23669"),TTLL1
括弧内にグループ化されたすべての項目が1つの変数になるように変数数を操作したいと思います。残念ながら、私の文書には、括弧内に複数のカンマ区切り値を持つ3行などの複数の項目があります。
括弧内のカンマでのみ機能するsed式はありますか?
予想される出力は次のとおりです。
c("4288" "57534"), MIB1
c("2272" "2385"),FHIT
c("5550" "10531" "56239"),PREP
c("25809" "23669"),TTLL1
乾杯。
答え1
高度な正規表現perl
には使用しないでください。sed
perl -pe 's/(?:\G[^,)]*|\([^,)]*)\K,(?=.*?\))//g' input.csv
c("4288" "57534"),MIB1
c("2272" "2385"),FHIT
c("5550" "10531" "56239"),PREP
c("25809" "23669"),TTLL1
これにより、括弧内に表示されるすべてのコンマが削除されます。
答え2
私はすでに同じ解決策で答えましたここ、これはあなたの質問にも適用され、ここで少し修正されました。
sed -E ':loop s/(\([^)]*),([^)]*\))/\1\2/; t loop' infile
分解:
ノート:エスケープされていない文字クラス(
または)
外部文字クラスは、エスケープされた文字[...]
クラスと一致するために使用されます。\(
合計は負の一致です。\)
[...]
(
)
^
[^)]
任意の単一文字ですが、)
」。
それから私達は次を持っています:
(\([^)]*)
:最初のグループのゲームは\1
後ろにある審判を意味します。
,
: 単一のカンマに一致します。
([^)]*\))
:2番目のゲームセットを遡って\2
言います。
次の例の行を検討し、一致がどのように機能するかを説明します。
c(("4288", "57534", "somtoher")),d("f1", "f2", "f3"),MIB1
これは(\([^)]*),([^)]*\))
次のように一致します。
最初の開き括弧から始まり、
(
aを除くすべての項目から最後の閉じ括弧まで)
。したがって、最初の一致セットは上記の例の行の一部と一致します。,
)
\1
(("4288", "57534",
次に、最後から
,
最初の閉じ括弧までのすべての内容と)
それ自体が2番目の一致セットに含まれ、上記の例の行の一部に\2
なります。"somtoher")
replacementセクションでは、
\1\2
一致する2つのグループを再インポートしますが、それらの間のカンマを削除します。:loop s///; t loop
; sedループ内の(
&の間のすべてのコンマ(ラベルとして使用されます)がクリアされるまで、手順1〜3を実行します。)
loop
最初の試みでは、サンプル行は次のように変更されます。
c(("4288", "57534" "somtoher")),d("f1", "f2", "f3"),MIB1
2番目の試みは次のとおりです。
c(("4288" "57534" "somtoher")),d("f1", "f2", "f3"),MIB1
3番目の試みは次のとおりです。
c(("4288" "57534" "somtoher")),d("f1", "f2" "f3"),MIB1
など。