1

Applescript とシェル スクリプトでのエスケープに少し問題があります。基本的に、URL は variableUrl として設定され、これがシェル スクリプトに入力されます。

do shell script "cd dir; cat file | grep -v '^http' | sed 's/^/" & variableUrl & "/' > urlsxy.txt"

これは機能していません — 出力ファイルに何も表示されません。問題は、エスケープされていない文字があることだと思います。さらに悪いことに、URL がどのように表示されるかを前もって知ることができないため、エスケープとしてバックスラッシュを挿入する方法を設定できません。を使用する代わりに、variableUrlダミーテキストを挿入するだけで問題ありません。たとえば、これは正常に機能します。

do shell script "cd dir; cat file | grep -v '^http' | sed 's/^/dummytext/' > urlsxy.txt"

ちょうど今、URLをbash変数に変えてやってみました...

sed 's/^/"$BASHVAR\\/g

おそらく同じ理由で、これも失敗します。この問題の回避策があるかどうか、またはその内容がどうなるかを事前に知らずに変数全体をエスケープする方法があるかどうか、誰か教えてもらえますか?

私はこれに非常に慣れていません。ご覧のとおり、基本的なことしか知りません。

4

2 に答える 2

2

この記号「^」を置き換えたいと仮定すると、これは機能するはずです。

sed "s/\^/`printf '%q' "${BASHVAR}"`/g"

または、各行の先頭に $BASHVAR の内容を挿入するには:

sed "s/^/`printf '%q' "${BASHVAR}"`/g"

注: printf ステートメントを囲むバッククォート (`) は重要です。これは、シェルに実行して次の結果を取得するように指示するためです。

printf '%q' "${BASHVAR}"

編集:スラッシュが $BASHVAR に表示される可能性があるという追加の制限 (この回答のコメントを参照) を考慮するには、別の解決策は、スラッシュとは異なる文字を sed の区切り文字として使用することです。2 つの例:

sed "s@^@`printf '%q' "${BASHVAR}"`@g"
sed "s#^#`printf '%q' "${BASHVAR}"`#g"
于 2013-06-21T18:29:05.853 に答える
1

awk は、-v を使用した変数の受け渡しをサポートしています。

v=\'\"\$'  '; awk -v v="$v" '!/^http/{print v$0}' file > urlsxy.txt

gsub の最初の引数は正規表現ですが、エスケープするか、別のスクリプト言語を使用できます

$ echo a. | awk -v v=. '{gsub(v,"y")}1'
yy
$ echo a. | awk -v v=\\\\. '{gsub(v,"y")}1'
ay
$ echo a. | v=. ruby -pe '$_.gsub! ENV["v"], "y"'
ay

この場合、次のようなこともできます。

do shell script "while IFS= read -r l; do [[ $l = http* ]] || printf %s " & quoted form of variableUrl & "\"$l\"; done < /tmp/file"

于 2013-06-21T22:22:27.387 に答える