それを機能させるには、エスケープ文字をエスケープする必要があります\
。
$ echo 'bla;\"bli bli\";otherbla' | sed -e 's/\\\"/""/g'
bla;""bli bli"";otherbla
bashスクリプトの場合、CSVファイルから読み取った行がsedに渡すときに正しく引用符で囲まれていることを確認する必要があります。CSVファイルの例とファイルからの読み取り方法を教えてください。
を使用しcat file | while read
て、問題の例を次に示します。
$ cat test.csv
bla;\"bli bli\";otherbla
ble;""bli bli"";otherbla
bli;\"blo\";otherbla
$ cat test.sh
#!/bin/bash
cat test.csv | while read line;
do echo "$line" | sed -e 's/\\\"/""/g'
done
$ ./test.sh
bla;"bli bli";otherbla
ble;""bli bli"";otherbla
bli;"blo";otherbla
1つの解決策は、スクリプトでechoを使用せずに、ファイルで直接sedを使用し、結果のcsvを新しいファイルに保存することです。
$ sed -e 's/\\\"/""/ig' test.csv > test-tmp.csv
$ cat test-tmp.csv
bla;""bli bli"";otherbla
ble;""bli bli"";otherbla
bli;""blo"";otherbla
次に、コメントで指摘されているように、引用符で囲まれたフィールドの混乱や誤った置換を回避するために、\
2つのsed式を使用し、フィールドセパレーターを含めて、フィールドセパレーターの前後のみ\"
を置換するようにします(私の例では、フィールドセパレータは)ですが、これは、次の行などのフィールドの最後の文字として;
一重引用符で囲まれたフィールドを考慮していません。\
blo
$ cat test.csv
bla;\"bli bli\";otherbla
ble;""bli bli"";otherbla
bli;\"blo\";otherbla
blo;"bli bli\";otherbla
blu;""bli bli\"";otherbla
$ sed -e 's/;\\\"/;""/ig' -e 's/\\\";/"";/ig' test.csv
bla;""bli bli"";otherbla
ble;""bli bli"";otherbla
bli;""blo"";otherbla
blo;"bli bli"";otherbla
blu;""bli bli\"";otherbla
複数のsedコマンドがある場合は、スクリプトに入れることができます。同じように機能します。
$ cat s.sed
s/\\\"/""/g
それを使用する:
$ echo 'bla;\"bli bli\";otherbla' | sed -f s.sed
bla;""bli bli"";otherbla
sed -f s.sed test.csv > test-tmp.csv