2

私は過去 30 分間、これで頭を悩ませてきましたが、これまでに試したことはすべて惨めに失敗しました!

htmlファイルの中では、タグ内にフィールドがありますが、フィールド自体は>記号からスペースで区切られていないため、awkでは読みにくいです。基本的には開始タグの後にスペースを1つ追加したいのですが、gsubとawkは連携を拒否しています。

私はもう試した

awk 'gsub("class\\\'\\\'>","class\\\'\\\'>")' filename

一重引用符をエスケープするには 1 つのバックスラッシュが必要なため、2 つ目はバックスラッシュ自体をエスケープするために、3 つ目はシーケンス \' をエスケープするために必要ですが、ターミナル (私は Mac で作業しています) は実行を拒否し、代わりに次の行に移動します。私からの他の入力を待っています。

助けてください :(

4

2 に答える 2

1

Bash では、一重引用符はエスケープの種類をまったく受け入れません。たとえば、次のコマンドを書いたとします。

$ echo '\''
>

Bash は'、2 番目の で閉じられた文字列を開いたと見なし、'のみを含む文字列を生成します\。次'の は、新しい文字列の開始と見なされるため、bash は次の行でさらに入力を期待します ( によって通知されます>)。

echoこの事実に気付いていない場合、以下のコマンドの後の文字列はまだ開いていると思うかもしれませんが、閉じています。

$ echo 'will this string contain a single quote like \'
will this string contain a single quote like \

だから、あなたが書くとき

'gsub("class\\\'\\\'>","class\\\'\\\'> ")' 

gsub("class\\\バックスラッシュと引用符(\')で連結された文字列を書いています。次に大なり信号。この後、","はコンマを含む文字列として解釈されます。これは、式の先頭の一重引用符が以前に閉じられていたためです。今のところ、結果は次のとおりです。

gsub("class\\\\'>,

コンマの後に文字列がありclass、その後にバックスラッシュと引用符が続き、その後に別のバックスラッシュと別の引用符が続き、最後に大なり記号とスペースが続きます。これは現在の文字列です:

gsub("class\\\\'>,class\'\'> 

これは有効な awk 式ではありません! とにかく、さらに悪いことに、二重引用符"は文字列を開始し、閉じ括弧と単一引用符を含みますが、この文字列は決して閉じられません!

要約すると、問題は、Bash で文字列を開いた場合、その前にバックスラッシュをいくつ入れても'、次の文字列で強制的に閉じられることです。'

解決策': andを使用して文字列を開いたり閉じたりするいくつかのトリックを作成できますが、"すぐに面倒になります。私の提案する解決策は、 awk 式をファイルに入れることです。次に、-fawk のフラグを使用します。このフラグにより​​、awk は次のファイルを実行します。

$ cat filename # The file to be changed
class''>
class>
class''>
$ cat mycode.awk  # The awk script
gsub("class''>", "class''>[PSEUDOSPACE]")
$ awk -f mycode.awk filename  # THE RESULT!
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]

ファイルを書きたくない場合は、いわゆるhere ドキュメントを使用します。

$ awk -f- filename <<EOF 
gsub("class''>", "class''>[PSEUDOSPACE]")
EOF
class''>[PSEUDOSPACE]
class''>[PSEUDOSPACE]
于 2012-05-30T18:14:14.390 に答える