2

わかりました。検索文字列に基づいて行を挿入しようとしている状況でロックされています。私はこれをAWKとSEDで、単一の作業または単純なものを使用して行うことに慣れています。

一重引用符と角かっこを含む文字列を挿入する方法(例:これは機能します)

     awk '/('Backup/ {print "NEWLINE"  } {print}' filename.sh 

そしてこれも

    sed -e '/\(\'backup/i\
    newline ' filename.sh

改行の代わりに-私はこれが欲しい"('no good white.cap;')、"

「」と「」で囲まれたすべて

4

2 に答える 2

2

あなたがやろうとしていることは、awkorとは何の関係もありませんsed。たとえば、次を参照してください。

print " '\'' data_between_two_single_quotes '\'' "

最初の文字は、開始シェル文字列リテラルを'閉じます。'シェル リテラルは、このためのバックスラッシュ エスケープをサポートしていません。'\''一重引用符リテラルを閉じ、(一重引用符リテラルの外でサポートされているエスケープを使用して) 引用文字を指定してから、新しい一重引用符リテラルを再度開きます。一重引用符を取得するための 4 文字のエスケープ シーケンスと考えることができます。

したがって、awkコマンドは次のようになります。

awk '/\('\''Backup/ {print " ('\''Drop the no good white.cap ;'\'' ) , " } { print }' filename.sh 

sedコマンドは次のようになります。

sed -e '/\('\''Backup/i\
('\''Drop the no good white.cap ;'\'' ) , ' filename.sh

編集:

for i in *; do awk -v database="$DB" -v table="$TB" 'BEGIN { print "header" } /backup/ { print " ('\''DROP TABLE " database "." table ";'\'' ) , " }1' "$i" > "${i}.new"; done

説明:

シェルforループを使用して、ディレクトリ内のすべてのファイルをループします。ブロックを含むファイルにヘッダーを追加しますBEGIN。単語を見つけて、シェル変数とbackupを含む行を出力します。スクリプトの最後で、デフォルトで印刷を有効にします。の省略形です。HTH。DBTB... }1'awk{ print }

于 2012-12-04T05:38:22.353 に答える
1

awk を使用した別の方法:

コンテンツを別のファイルに挿入する:

$ cat file1
 " ('Drop the no good white.cap ;' ) , "

awk の使用:

$ awk '/\('\''Backup/{getline x<"file1";print x;}1'  filename.sh

getline を使用すると、file1 の行が変数 x に読み込まれ、パターンに遭遇すると出力されます。これにより、引用符をエスケープするためのエスケープ文字を使用できなくなります。

于 2012-12-04T05:47:25.663 に答える