1

たとえば、長いsedラインをどのように壊すのでしょうか。

sed -n 's/.*<a href="\(.*\)" target="_blank" rel="nofollow">Download<\/a>.*/\1/p'

たとえば、次のようなものが必要です。

sed -n 's/.*<a href="\(.*\)" target="_blank" 
  rel="nofollow">Download<\/a>.*/\1/p'

「\」については知っていますが、sedでは機能しません。ありがとうございました。

4

3 に答える 3

1

複数の変数を使用した回避策を見つけました。完璧ではありませんが、機能します。これは、他の誰かが同様の問題を抱えている場合に備えています。誰かがより良い解決策を見つけた場合は、ここで共有してください。

str1='<a href="\(.*\)" target="_blank"'
str2='rel="nofollow">Download<\/a>'
sed -n "s/.*$str1 $str2.*/\1/p"

別の方法は、少しクリーンな方法であるヒアドキュメントを使用することです。

str=$(cat <<'EOF'
<a href="\(.*\)" target="_blank" \
rel="nofollow">Download<\/a>
EOF
)

sed -n "s/.*$str.*/\1/p"

さて、printf をこのように使用できることもわかりましたが、二重引用符をエスケープする必要があります。

str=$(printf "<a href=\"\(.*\)\" target=\"_blank\" \
rel=\"nofollow\">Download<\/a>")

sed -n "s/.*$str.*/\1/p"

最もクリーンな方法はこれです。

str="<a href=\"\(.*\)\" target=\"_blank\" \
rel=\"nofollow\">Download<\/a>"

sed -n "s/.*$str.*/\1/p"
于 2013-02-05T00:25:56.480 に答える
1

sedレベルではなく、シェルレベルでそれを壊すことができます:

sed -n 's/.*<a href="\(.*\)" target="_blank" '\
'rel="nofollow">Download<\/a>.*/\1/p'

残念ながら、2 行目をインデントすることはできません。

于 2013-02-05T00:49:35.420 に答える
0

実際には、置換ではなく文字列(url)を抽出したいと考えています。sed をドロップして grep を実行するのはどうですか? 短いでしょう!

grep -Po '(?<=href=")[^"]*' file

例:

kent$  echo 'foo<a href="IWantIt" target="_blank" rel="nofollow">Download</a>baz'|grep -Po '(?<=href=")[^"]*'
IWantIt
于 2013-02-04T23:22:54.483 に答える