次のCSVファイルがあります。
HEADER
"first, column"|"second "some random quotes" column"|"third ol' column"
FOOTER
そして、次のような結果を見つけてください。
HEADER
first, column|second "some random quotes" column|third ol' column
つまり、FOOTER
start、end、aroundから引用符を削除します|
。
これまでのところ、このコードはうまくいきます:
sed '/FOOTER/d' csv > csv1 | #remove FOOTER
sed 's/^\"//' csv1 > csv2 | #remove quote at the beginning
sed 's/\"$//' csv2 > csv3 | #remove quote at the end
sed 's/\"|\"/|/g' csv3 > csv4 #remove quotes around pipe
ご覧のように、問題は4つの追加ファイルを生成することです。
追加のファイルを生成せずに単一のスクリプトで同じことを行うことを目的とする別のソリューションがあります。効果はあまり良くありません。
#!/bin/ksh
sed '/begin/, /end/ {
/FOOTER/d
s/^\"//
s/\"$//
s/\"|\"/|/g
}' csv > csv4
ベストアンサー1
まず、Michaelが示したように、これらすべてを1つのコマンドにまとめることができます。
sed '/^FOOTER/d; s/^\"//; s/\"$//; s/\"|\"/|/g' csv > csv1
一部のsed
実装ではこれに対処できず、次のことが必要になる場合があります。
sed -e '/^FOOTER/d' -e 's/^\"//' -e 's/\"$//' -e 's/\"|\"/|/g' csv > csv1
つまり、フィールドが定義されているように見え、フィールド内にフィールドを残してフィールド全体を|
削除したい場合です。"
この場合、次のことができます。
$ sed '/FOOTER/d; s/\(^\||\)"/\1/g; s/"\($\||\)/\1/g' csv
HEADER
first, column|second "some random quotes" column|third ol' column
またはGNUを使用してくださいsed
。
sed -r '/FOOTER/d; s/(^|\|)"/\1/g; s/"($|\|)/\1/g' csv
Perlも使用できます。
$ perl -F"|" -lane 'next if /FOOTER/; s/^"|"$// for @F; print @F' csv
HEADER
first, column|second some random quotes column|third ol' column