4

,ID のリストを、 and/or\r\nで構成される区切り文字の使用から の使用に変換する必要があり\nます,|。(基本的に:s/[,\r\n]+/,\|/g末尾なし|)

入力データの例:

123,456,789,012

また

123,
456
789,
012

そして、結果の出力を次のようにする必要があり123,|456,|798,|012,ます。各フィールドを終了するコンマと、それらを区切るパイプです。

これを行うのは非常に簡単に思えますが、これを管理する方法については非常に困惑しています。私は試してみました...実際にはかなりの方法がありますが、何もうまくいかないようです。以下にいくつかの例を示します。

  1. sed "s/[,\r\n]+/,\|/g" < filenameどの区切り文字とも一致しません。

  2. sed "s/(,|,?\r?\n?)/,\|/g"も何も一致しません。

  3. tr -t "(,?(\r|\n)+)" ",\|"そしてtr -t "[,\r\n]+" ",\|"交換するだけ,

  4. tr "(,|\r?\n)" ",\|",but で正しく動作し、一致した文字を複数のバーに置き換えます,\n,\r\n元:123|||456|||789|||012|

  5. より複雑になる: sed ':a;N;$!ba;s/\n/,/g"(ここ\nから取得) はに正しく置き換えられます,が、 では機能しません\r\n。を に置き換えると\n[,\r\n]単純に入力が返されます。

私は困惑しています。誰でもこれについて助けやアドバイスを提供できますか?

4

2 に答える 2

3

サンプル出力から、出力の最後にパイプがないようです。,各フィールドの終わりをマークし、フィールドのペア|を分離しています。その仕様では、これは とtrで機能しsedます:

$ x="123,
> 456
> 789,
> 012"
$ echo "$x" | tr -s '\r\n' ',' | sed 's/,\(.\)/,|\1/g'
123,|456,|789,|012,
$

このtrコマンドは、改行とキャリッジ リターンをカンマに置き換え、-s重複を圧縮 ( ) します。このsedコマンドは、コンマの後に別の文字が続くのを探し、それを に置き換えます,|

于 2013-05-30T02:30:57.870 に答える
0

私がしていることは、\r\n シーケンスを \n に正規化して、1 つの選択肢を取り除くことです (そして、次のステップの速度を上げます)。

perl -pi -e 'BEGIN { $/ = undef; } s/\r\n/\n/g; s/[,\n]/,|/g;'

更新:あなたの例から、区切り文字の複数の発生をそれらの間に何もないものに置き換えることを意図しているように見えます。それがやりたいことなら、コマンドを次のように変更します。

perl -pi -e 'BEGIN { $/ = undef; } END { print ",\n"; } s/\r\n/\n/g; s/[,\n]+/,|/g;'

また、最後のフィールドの後に , が必要です。

于 2013-05-30T02:25:18.837 に答える