0

そのため、MySQL データベースに挿入する名前を派生するディレクトリを実行しています。一部の名前には一重引用符 (') が付いています。私はawkを使用しています

ls *| awk -F=: '{print "INSERT into citation_sources (source_name) VALUES (" "'\''" $1 "'\''" ");"}'

出力を awk から適切に表示することはできますが。例えば:

INSERT into citation_sources (source_name) VALUES ('Black's Law Dictionary, 2nd Edition (Black 1891));

データを MySQL に挿入するときは、2 回目のデータ編集を行って単一引用符を\'.

私のためにこれを行うために私のawkに欠けているものは何ですか?

4

2 に答える 2

0

これをawkスクリプトのBEGIN{}セクションに入れてください。

echo "Black's Law D'icti'onary"|awk '{
ESC=sprintf("%c",0x5c);
SQ=sprintf("%c",0x27);
DQ=sprintf("%c",0x22);
# then perfrom a 
gsub(SQ,ESC""SQ);
# and such. same goes for other stuff.
}'

持っていると便利です:-)

于 2012-08-13T08:18:25.043 に答える
0

awk になる前にこれを解決するのが最も簡単です。古い がない場合はls、パラメーター リストに -Q (引用符) を追加するだけです。

$ ls -Q * | awk -F=: '{print "INSERT into citation_sources (source_name) VALUES (" "'\''" $1 "'\''" ");"}'
INSERT into citation_sources (source_name) VALUES ('"Black's Law Dictionary, 2nd Edition (Black 1891)"');

これは、@shellter が言ったように、実際に値を引用する方法を検討する必要があるときです。

または、最初に sed などにパイプして、バックスラッシュを取得します (例: sed "s,',\\\\',g")。

awk だけでエスケープして解決するのは、思ったよりもトリッキーです。なぜなら、bash は引用符を消費してエスケープするからです。したがって、「\」を生成することは最も困難な部分であり、生き残るために awk シェル生成が失敗しました。

$ ls * | awk -F=: "{print \"INSERT into citation_sources (source_name) VALUES ('\" gensub(\"'\",\""$'\\\\'"\\\'\",\"global\",\$1) \"');\"}"
INSERT into citation_sources (source_name) VALUES ('Black\'s Law Dictionary, 2nd Edition (Black 1891)');
于 2012-07-01T17:37:55.673 に答える