たとえば、私は次のようなscvファイルを持っています
a1, b1, c1, d1
a2, b2, c2, d2
a3, b3, c3, d3
私がやりたいことは、最初のコンマを置き換えることです,
とセミコロン;
。最初のコンマの位置は可変にすることができます(a
およびn
の行のm
は異なる長さにすることができます)。最後に私のファイルは次のようになります
a1; b1, c1, d1
a2; b2, c2, d2
a3; b3, c3, d3
他のコンマは残しておく必要があります。誰かが最も簡単な解決策を教えていただけますか?
PS私のソリューションは動作しません:sed '/s/,/;/g' file.csv
純粋bashソリューション
while IFS=\, read -r a b ; do echo "$a;$b" ; done <file.csv
または単に楽しみのために
paste -d\; <(cut -d, -f1 file.csv) <(cut -d, -f1 --complement file.csv)
のg
:
sed 's/,/;/g'
globally用です。つまり、すべての,
を;
で置き換えます。
1行につき1つだけ置換したい場合は、g
を外します。
sed 's/,/;/'
そして完全性のために:
置換するオカレンスを指定することもできます。たとえば、2番目のオカレンスのみを置き換えるには、次のようにします。
sed 's/,/;/2'
GNU sed
を使用すると、2番目のものから始まるすべてのオカレンス(つまり、最初のものを除くすべて)を次のもので置き換えることもできます。
sed 's/,/;/2g'
この場合、2つの置換を実行するには:
sed 's/,/;/;s/,/;/'
より複雑になるのは、パターンが置換(またはその一部)に一致する場合です。たとえば、,
を<,>
で置換する場合などです。 sed
には、これに対処するための組み込みメカニズムがありません。その場合は、代わりにPerl
を使用できます。
Perl -pe '$i = 0; s/,/$i++ < 2 ? "<,>" : $&/ge'
Perl -pe
はPerl
のsed
モードです(正規表現の構文が異なることに注意してください)。 s///
演算子のe
フラグを使用すると、置換はコードと見なされます。そこでは、インクリメントされたカウンターが2未満の場合にのみ、,
を<,>
に置き換えます。それ以外の場合は、,
をそれ自体に置き換えます($&
は、実際にsed
のs
コマンドで&
のような一致した文字列を参照します)。
ある範囲または一連の置換に対してそれを一般化できます。 3のようにrd 5に番目 と7番目 9に番目:
Perl -pe '$i = 0; s/,/$i++;
$i >=3 && $i <= 5 || $i >= 7 && $i <= 9 ? "<,>" : $&/ge'
最初の出現のみを置き換えるには入力全体(各行とは対照的に):
sed -e 's/,/;/;t done' -e b -e :done -e 'n;b done'
つまり、最初の置換が成功したら、残りの入力を出力するだけのループに入ります。
GNU sed
を使用すると、疑似アドレスを使用できます。
sed '0,/,/s//;/'
それはタイプミスだと思いますが、
sed '/s/,/;/g'
あなたがあなたの質問に書いたコマンドは、まったく違うものです。
それはやっています:
sed '/start/,/end/g'
ここで、start
はs
で、end
は;
です。つまり、g
を含むファイルの間にあるファイルのセクションにs
コマンドを適用する(パターンスペースをホールドスペースのコンテンツで置き換える(ここでは何も保持しないので空))そして、次は;
を含むものです。