6

次の問題がほとんどあり、解決策が見つかりませんでした。これは私の CSV ファイル構造である可能性があります。

1223;"B630521 ("L" fixed bracket)";"2" width";"length: 5"";2;alternate A
1224;"B630522 ("L" fixed bracket)";"3" width";"length: 6"";2;alternate B

ご覧のとおり"、インチと"L"囲みの中にいくつか書かれてい"ます。

現在、次の例のように、 "(インチ) と二重引用符を 2 つの単一引用符に置き換える UNIX シェル スクリプトを探しています。"L"

sed "s/$OLD/$NEW/g" $QFILE > $TFILE && mv $TFILE $QFILE

誰でも私を助けることができますか?

4

3 に答える 3

3

多分これはあなたが望むものです:

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g"

すなわち:"数字 ( [0-9]) の後にセミコロン ( [^;]) が続いていない二重引用符 ( ) を見つけて、2 つの単一引用符に置き換えます。

編集: コマンドを拡張できます(現在はかなり長くなっています):

sed "s/\([0-9]\)\"\([^;]\)/\1''\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g;s/\([^;]\)\"\([^;]\)/\1\'\2/g"

SunOS を使用しているため、拡張正規表現 ( ) を使用できないと思いますsed -rか? したがって、私はそのようにしました。最初のsコマンドは、すべてのインチ"''に置き換えます。2 番目と 3 番目のコマンドはs同じです。"それらは、 a の直接の隣人ではないすべてを;単一の に置き換えます'"たとえば、両方の間に"L"文字が 1 つしかなく"、この文字が既に\([^;]\). このようにして、 にも置き換え""ます''"""またはなどがある場合""""は、もう1つ追加する必要があります(ただし、もう1つだけ)s

于 2011-05-12T15:05:21.553 に答える
3

更新 (完全な先読み機能を利用できるため、perl を使用するのは簡単です)

perl -pe 's/(?<!^)(?<!;)"(?!(;|$))/'"'"'/g' file

出力

1223;"B630521 ('L' fixed bracket)";"2' width";"length: 5'";2;alternate A
1224;"B630522 ('L' fixed bracket)";"3' width";"length: 6'";2;alternate B

sed、grepのみを使用

grep、sed (perl、php、python などではありません) を使用するだけで、あまり洗練されていないソリューションが次のようになります。

grep -o '[^;]*' file | sed  's/"/`/; s/"$/`/; s/"/'"'"'/g; s/`/"/g' 

出力 - 入力ファイルの場合、次のようになります。

1223
"B630521 ('L' fixed bracket)"
"2' width"
"length: 5'"
2
alternate A
1224
"B630522 ('L' fixed bracket)"
"3' width"
"length: 6'"
2
alternate B
  • grep -o基本的に入力を分割しています;
  • sed は最初に行頭の " を ` に置き換えます
  • 次に、行末の " を別の ` に置き換えます
  • 次に、残りのすべての二重引用符"を一重引用符に置き換えます'
  • "最後に、最初と最後にすべてを戻します
于 2011-05-12T15:47:56.500 に答える
2

「L」については、これを試してください:

 sed "s/\"L\"/'L'/g"

インチの場合は、次を試すことができます。

sed "s/\([0-9]\)\"\"/\1''\"/g" 

それが最良の選択肢かどうかはわかりませんが、試してみたところうまくいきました。これがお役に立てば幸いです。

于 2011-05-12T15:26:05.117 に答える