次のテキストファイルがあります。
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
カンマをセミコロンに置き換える方法、 2番目から始めましょう(そして最後まで続く)?
次の出力を取得したい。
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
答え1
これにより、これを行うことができます。
$ sed -e 's/,/;/g' -e 's/;/,/1' infile
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
説明する
s/,/;/g
次の項目をすべて置き換えます,
。;
s/;/,/1
最初の項目を;
次に置き換えます。,
GNUがあればsed
、シンプルで使いやすい次のことを試すこともできます。
sed 's/,/;/2g' infile
答え2
入力にすでにセミコロンがある可能性がある場合は注意が必要です。
$ sed 's/,/\n/g; s/\n/,/; s/\n/;/g' input
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
sedは入力を1行ずつ読み取るため、通常の入力には改行文字はありません。したがって、すべてのカンマを改行文字に置き換えることができ、混乱がないことがわかります。次に、最初の改行文字をコンマに復元します。最後に、残りの改行をセミコロンに置き換えます。
もっと詳しく:
s/,/\n/g
すべてのカンマを改行に置き換えます。s/\n/,/
最初の改行文字をカンマで置き換えます。s/\n/;/g
残りの改行をセミコロンに変更します。
答え3
使用awk
:
awk '{gsub(",", ";"); sub(";", ","); print}' file.txt
gsub(",", ";")
すべて,
次へ交換;
sub(";", ",")
最初のものを;
次に置き換えます。,
例:
% cat file.txt
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
% awk '{gsub(",", ";"); sub(";", ","); print}' file.txt
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
答え4
$ cat ip.txt
test1,test2,test3
test4,test5
test6,test7,test8,test9,test10
test11,test12,test13,test14
test15
$ perl -F, -ane 'print "$F[0]"; print ",".join(";",@F[1..$#F]) if($#F > 0)' ip.txt
test1,test2;test3
test4,test5
test6,test7;test8;test9;test10
test11,test12;test13;test14
test15
他の方法:
perl -F'/(,)/,$_,2' -ane '$F[2] =~ s/,/;/g; print @F'
/(,)/,$_,2
$_
使用された方法に応じて,
(入力ライン)を2つの部分に分け(,)
、区切り文字をキャプチャし、以下に説明するように3つの要素を作成します。$F[0]
最初のフィールドを取得します。存在する場合はインポートします$F[1]
。,
$F[2]
残りのフィールドを取得する(存在する場合)
もう一つの方法があります。sed 's/,/;/2g'
perl -pe '$c=0; s/,/++$c<2 ? $& : ";"/ge' ip.txt
- 各行のカウンタ初期化
- 交換時に必要に応じてカウンタ値を確認してください。
- 修飾子を使用すると、
e
Perlコードが代替セクションに表示されることがあります。