3

私はこれに似た行を持っています

grep -oP "data-context-item-title=.*.data-context-item-id" web.html | cut -d'"' -f2

端末で使用したため、この行が正しく機能し、目的の出力が得られたことがわかります。ただし、この行をbashスクリプトに入れたいです。だから私はこれまでこれを持っています

title="$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)"

これは最初の「(引用)」とカットの「(引用)」が一致したため問題です。とにかく回避する方法はありますか?

カット機能なしの出力は、これに似たものです

data-context-item-title="Some long title" data-context-item-id
data-context-item-title="Another very long title" data-context-item-id

sed または awk コマンドを使用してカットを置き換えることはできないことに注意してください。

ありがとう

4

5 に答える 5

3

あなたはbashを使用しているので、使用するのに十分安全です:

title=$(grep -oP 'data-context-item-title=.*.data-context-item-id' web.html | cut -d'"' -f2)

これにより、変数の内部スペース (特に改行) が保持されます。

echo "$title"

使用する UNIX™ 7 th$(...) Edition Bourne Shell を見つけることができた場合、表記 (または、より正確には表記) を囲む二重引用符を省略する`...`ことは安全ではないと私は考えていますが、最新のシェル (前のミレニアムではなく、現在のミレニアムで最後に更新されたものなど) で安全に動作します。難しいのは、古いボーン シェルを見つけて、現在不安定な (遠いため) 記憶を検証することです。

しかし、私を困惑させているのは、bashMac OS X 10.7.5 で実行されている 3.2 (システム) と 4.2 (自家製) の両方で、二重引用符の有無にかかわらず、コードが正しく機能することです$(...)。のどのバージョンをbash、どのプラットフォームで使用していますか?

于 2012-11-03T20:59:33.127 に答える
0

カットの区切り文字のパラメーターは、単一引用符ではなく二重引用符です。バックラッシュを使用して実際の引用符をエスケープする

于 2012-11-03T19:20:53.723 に答える
0

ワイルドな提案: コマンド内の引用符の 1 つがプレーンな ASCII 引用符ではなく、ある種の Unicode ファンシー クォート (シェルが認識しない) である可能性はありますか?

于 2012-11-03T21:31:35.423 に答える
0

まず、エラーを解決するには、二重引用符を次のようにエスケープしますcut

title="$(... | cut -d \" ...)"

ただし、grep の PCRE を使用しているため、ルックアラウンドとドロップ カットをまとめて使用できます。

title=$(grep -oP '(?<=data-context-item-title=").*?(?=" data-context-item-id)' web.html)
于 2012-11-04T13:03:33.913 に答える
-1

タイプミスかどうかはわかりませんが、の閉じ括弧を忘れたようです$(...)

于 2012-11-03T19:31:46.060 に答える