3

いくつかの文字列を見つけて置き換えるためのAppleScriptがあります。&を含む置換文字列があるという問題が発生しましたが、置換プロパティリストに\&を含めることで回避できました。ただし、アポストロフィははるかに厄介なようです。

単一のアポストロフィを使用すると無視され(置換には含まれません)、\'を使用すると構文エラーが発生し(「 "」が必要ですが、不明なトークンが見つかりました)、\'を使用すると再び無視されます(これを続行できますが、偶数は無視されます不均一は構文エラーを取得します)

実際のsedコマンドのアポストロフィを二重引用符(sed's…'ではなくsed"s…")に置き換えてみました。これはコマンドラインでは機能しますが、スクリプトで構文エラーが発生します(行の終わりが予想されるなど)。 。しかし、識別子が見つかりました。)

一重引用符はシェルを混乱させ、二重引用符はapplescriptを混乱させます。

ここで提案されているように「\」を試し、ここから「」「」を試しました。

エラーの種類を取得するための基本的なスクリプト:

set findList to "Thats.nice"
set replaceList to "That's nice"
set fileName to "Thats.nice.whatever"
set resultFile to do shell script "echo " & fileName & " | sed 's/" & findList & "/" & replaceList & " /'"
4

2 に答える 2

1

試す:

set findList to "Thats.nice"
set replaceList to "That's nice"
set fileName to "Thats.nice.whatever"
set resultFile to do shell script "echo " & quoted form of fileName & " | sed \"s/Thats.nice/That\\'s nice/\""

またはあなたの例に固執する:

set findList to "Thats.nice"
set replaceList to "That's nice"

set fileName to "Thats.nice.whatever"
set resultFile to do shell script "echo " & quoted form of fileName & " | sed \"s/" & findList & "/" & replaceList & "/\""

説明:

sedステートメントは通常、次のように一重引用符で囲まれています。

set myText to "Hello"
set xxx to do shell script "echo " & quoted form of myText & " | sed 's/ello/i/'"

ただし、この例では、一重引用符を完全に除外することができます。

set myText to "Hello"
set xxx to do shell script "echo " & quoted form of myText & " | sed s/ello/i/"

引用符で囲まれていないsedステートメントは、スペースが含まれるとすぐに分解されます。

set myText to "Hello"
set xxx to do shell script "echo " & quoted form of myText & " | sed s/ello/i there/"
--> error "sed: 1: \"s/ello/i\": unterminated substitute in regular expression" number 1

一重引用符で囲まれたステートメント内にアポストロフィを含めることはできないため(エスケープしても)、sedステートメントを次のように二重引用符で囲むことができます。

set myText to "Johns script"
set xxx to do shell script "echo " & quoted form of myText & " | sed \"s/ns/n's/\""

編集LauriRantaは、検索または置換文字列にエスケープされた二重引用符が含まれている場合、私の答えは機能しないという良い点を述べています。彼女の解決策は次のとおりです。

set findList to "John's"
set replaceList to "\"Lauri's\""
set fileName to "John's script"
set resultFile to do shell script "echo " & quoted form of fileName & " | sed s/" & quoted form of findList & "/" & quoted form of replaceList & "/"
于 2012-10-08T00:18:35.767 に答える
0

テキストアイテムの区切り文字も使用します。AppleScript's後で使用しない場合は、デフォルトのスコープに含めたり、プロパティを元に戻したりする必要はありません。

set input to "aasearch"
set text item delimiters to "search"
set ti to text items of input
set text item delimiters to "replace"
ti as text

sedによって解釈されるものがパターンに含まれている可能性がある場合、検索をエスケープしたり、パターンを置き換えたりする簡単な方法はありません。

set input to "a[a"
set search to "[a"
set replace to "b"

do shell script "sed s/" & quoted form of search & "/" & quoted form of replace & "/g <<< " & quoted form of input

正規表現を使用する必要がある場合、Rubyのようなスクリプト言語には、文字列からパターンを作成するためのメソッドがあります。

set input to "aac"
set search to "(a+)"
set replace to "\\1b"

do shell script "ruby -KUe 'print STDIN.read.chomp.gsub(Regexp.new(ARGV[0]), ARGV[1])' " & quoted form of search & " " & quoted form of replace & " <<< " & quoted form of input without altering line endings
于 2012-10-08T19:25:37.750 に答える