Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash sed字符串中的AppleScript变量_Bash_Sed_Applescript - Fatal编程技术网

Bash sed字符串中的AppleScript变量

Bash sed字符串中的AppleScript变量,bash,sed,applescript,Bash,Sed,Applescript,我决不是一个AppleScript的专家,但我能过得去。为了替换基于变量的文件中的某些文本,我正在尝试将一些AppleScript变量传递给sed命令,这让我陷入了一个地狱般的境地 我在AppleScript中有两个对话框,用于获取用户数据,并存储这些变量。我的数据-这工作正常 set myData to text returned of ¬ (display dialog "Enter Your Data" with title ¬ "Data Entry" defau

我决不是一个AppleScript的专家,但我能过得去。为了替换基于变量的文件中的某些文本,我正在尝试将一些AppleScript变量传递给sed命令,这让我陷入了一个地狱般的境地

我在AppleScript中有两个对话框,用于获取用户数据,并存储这些变量。我的数据-这工作正常

set myData to text returned of ¬
    (display dialog "Enter Your Data" with title ¬
        "Data Entry" default answer ¬
        "" buttons {"Continue…"} ¬
        default button 1 ¬
        ) 

set searchFor to quoted form of "data1"
set searchFor2 to quoted form of "data2"
set inputFile to "/Users/User1/Desktop/file.txt"
set outputFile to "/Users/User1/Desktop/file1.txt"

do shell script quoted form of ("sed -i.bak s/" & searchFor & "/" & myData & "/g") & " " & inputFile & " > " & outputFile
我实际上得到了这个错误:没有这样的文件或目录,退出代码127。然而,奇怪的是,它确实写出了一个没有数据的文件。我不一定要像脚本所建议的那样写出一个diff文件,只需要在适当的位置编辑数据。然而,我在这方面没有任何成功,这就是为什么我这样做的原因

如果您对我的问题有任何帮助,我们将不胜感激

您当前的问题是,您多次错误地将引用的形式应用于,更重要的是,将引用的形式应用于sed可执行文件名、其选项和sed脚本,这总是会导致以下详细说明的中断:;请尝试以下操作-事先不要将的引号形式应用于任何变量-注意引号形式是如何分别选择性地应用于sed脚本和输入和输出文件的:

是否使用shell脚本的sed和引号形式 s/&searchFor&/&myData&/g &输入文件的引用形式("ed)输出文件的引用形式("ed) 请注意,我已经从命令中删除了-I.bak,因为它总是会产生一个空的输出文件:-I就地更新输入文件,不产生标准输出。因此,不会使用>outputFile将任何内容发送到outputFile

但是,如果searchFor和myData包含在sed正则表达式中具有特殊含义的字符,例如\、*、[,…或替换字符串,例如,&,\,则仍可能出现中断或行为异常

为了避免这种情况,您必须首先对输入字符串进行转义,不幸的是,这是非常重要的

以下处理程序提供了健壮的通用转义-它们基于,下面解释了底层命令[1]:

至于你最初的症状:

然而,奇怪的是,它确实写出了一个没有数据的文件

这表示do shell脚本a能够调用shell,b shell解析命令行时不会遇到语法错误;如果满足这些条件,则输出重定向(如>outFile)会导致在执行命令b之前将目标文件创建为零字节文件,或者(如果存在)将其截断为零字节文件埃金斯

如果命令执行失败,则留下零字节文件

我实际上得到了这个错误:没有这样的文件或目录,退出代码127

退出代码127表示无法调用作为命令字符串的第一个标记的可执行文件,因为找不到它

事实上就是这样,因为您错误地将的引号形式应用于sed可执行文件名、其选项和sed脚本,这导致整个结果字符串被解释为可执行文件名,这显然是失败的

让我们举一个简单的例子:

quoted form of "sed s/foo/bar/g file"
生成“sed s/foo/bar/g文件”,包括随附的单引号。 将此字符串传递给shell会导致shell将此字符串视为构成可执行路径或文件名的单个令牌。显然,没有文件名为SEDS/Foo/Bar/G文件,因此命令失败。

如上所述,解决方案是将sed、其选项、脚本以及输入文件名和输出文件名作为单独的标记传递。

您当前的问题是多次错误地应用引号形式,更重要的是,将引号形式应用于sed可执行文件名、其选项和sed脚本总的来说,这总是会中断,请参见下面的详细解释;请尝试以下操作-事先不将引用的形式应用于任何变量-注意引用的形式如何分别选择性地应用于sed脚本和输入和输出文件:

是否使用shell脚本的sed和引号形式 s/&searchFor&/&myData&/g &输入文件的引用形式("ed)输出文件的引用形式("ed) 请注意,我已从您的命令中删除-I.bak,因为它总是会导致一个空的输出文件:-I就地更新输入文件,不生成标准输出。因此,不会使用>outputFile将任何内容发送到outputFile

但是,如果searchFor和myData包含在sed正则表达式中具有特殊含义的字符,例如\、*、[,…或替换字符串,例如,&,\,则仍可能出现中断或行为异常

为了避免这种情况,您必须首先对输入字符串进行转义,不幸的是,这是非常重要的

以下处理程序提供了健壮的通用转义-它们基于,下面解释了底层命令[1]:

至于你最初的症状:

但奇怪的是,t 它写出来的文件中没有数据

这表明do shell脚本a能够调用shell,b shell解析命令行时没有遇到语法错误;如果满足这些条件,则输出重定向(如>outFile)会导致在命令执行开始之前将目标文件创建为零字节文件,或者(如果存在)将其截断为零字节文件

如果命令执行失败,则留下零字节文件

我实际上得到了这个错误:没有这样的文件或目录,退出代码127

退出代码127表示无法调用作为命令字符串的第一个标记的可执行文件,因为找不到它

事实上就是这样,因为您错误地将的引号形式应用于sed可执行文件名、其选项和sed脚本,这导致整个结果字符串被解释为可执行文件名,这显然是失败的

让我们举一个简单的例子:

quoted form of "sed s/foo/bar/g file"
生成“sed s/foo/bar/g文件”,包括随附的单引号。 将此字符串传递给shell会导致shell将此字符串视为构成可执行路径或文件名的单个令牌。显然,不存在名为sed s/foo/bar/g file的文件,因此命令失败


如上所述,解决方案是将sed、其选项、脚本以及输入文件名和输出文件名作为单独的标记传递。

您好,谢谢您的帮助。我试图将其应用于脚本,但我现在遇到一个错误,即。。错误«脚本»无法理解“quoteRegex”消息。《脚本》中的数字-1708可能是因为这是Mac OS X吗?@cybersurfr:很高兴能帮忙;错误消息表示您尚未在quoteRegex上定义。。。结束quoteRegex,可能还包括quoteSubst。。。上面第二个代码段中的处理程序。把它们放在同一个脚本中,然后再试一次。facepalm@PeterSmith是的,你说得对。一旦我像这样将它们添加到quoteRegextxt do shell脚本sed-I.bak中,它将在结果窗口中给出的s/“my quoteRegexsearchFor&/”my quoteSubstmyData&/g&“inputFile的quoted形式&>”outputFile end quoteRegex的quoted形式,但是没有任何更改,输出文件也不会被更改created@mklement0嗯,Alt+0172在Windows上工作!关于终端,我提到的Mac快捷方式在我的Mac终端OS X 10.9.5上运行良好,终端v2.4和iTerm2 Build 2.1.1都可以,也可以在文本编辑器、粘滞、查找器、Evernote等上运行,我不知道我是否做了什么。@mklement0同意,最后,这个问题解决了。您好,谢谢您的帮助。我试图将其应用于脚本,但我现在遇到一个错误,即。。错误«脚本»无法理解“quoteRegex”消息。《脚本》中的数字-1708可能是因为这是Mac OS X吗?@cybersurfr:很高兴能帮忙;错误消息表示您尚未在quoteRegex上定义。。。结束quoteRegex,可能还包括quoteSubst。。。上面第二个代码段中的处理程序。把它们放在同一个脚本中,然后再试一次。facepalm@PeterSmith是的,你说得对。一旦我像这样将它们添加到quoteRegextxt do shell脚本sed-I.bak中,它将在结果窗口中给出的s/“my quoteRegexsearchFor&/”my quoteSubstmyData&/g&“inputFile的quoted形式&>”outputFile end quoteRegex的quoted形式,但是没有任何更改,输出文件也不会被更改created@mklement0嗯,Alt+0172在Windows上工作!关于终端,我提到的Mac快捷方式在我的Mac终端OS X 10.9.5上运行良好,终端v2.4和iTerm2 Build 2.1.1都可以,也可以在文本编辑器、粘滞、查找器、Evernote等上运行,我不知道我是否做了什么。@mklement0同意,最后,这个问题解决了。如果答案解决了您的问题,请通过单击大复选标记接受它✓ 在它旁边,也可以选择向上投票,投票需要至少15个信誉点。如果你发现其他答案有帮助,请投票表决。接受和投票有助于未来的读者。请看。如果您的问题尚未完全回答,请提供反馈。如果答案解决了您的问题,请单击大复选标记接受✓ 在它旁边,也可以选择向上投票,投票需要至少15个信誉点。如果你发现其他答案有帮助,请投票表决。接受和投票有助于未来的读者。请看。如果您的问题尚未完全回答,请提供反馈。
quoted form of "sed s/foo/bar/g file"