3

我正在创建一个自动化进程,但我需要获取字符串并将所有“\”字符替换为字符“/”。与朋友一起工作,我们决定使用 shell 脚本,但我愿意做任何事情。使用我们编写的行,我们只会得到一个错误。

set input to (do shell script "echo \"" & input & "\" | sed 's/\\\\//g'")

谢谢

4

3 回答 3

3

尝试:

set myString to "This\\is\\my\\string" -- really This\is\my\string

set {TID, text item delimiters} to {text item delimiters, "\\"}
set myString to text items of myString
set text item delimiters to "/"
set myString to myString as text
set text item delimiters to TID

return myString

或者

set input to "This\\is\\my\\string" -- really This\is\my\string
set output to do shell script "echo " & quoted form of input & " | sed 's/[\\]/\\//g'"
于 2013-08-28T13:27:50.150 回答
1

据我所知,不再需要恢复 text item delimiters,因此 adayzdone 的示例可以简化为如下所示:

set s to "aa\\bb\\cc"
set text item delimiters to "\\"
set ti to text items of s
set text item delimiters to "/"
ti as text -- "aa/bb/cc"

do shell scriptuses /bin/sh,这是一个以 POSIX 模式启动的 bash 版本,并且还有一些其他更改。其中之一是xpg_echo默认启用,以便echo解释转义序列,如\t

do shell script "echo " & quoted form of "ss\\tt" & " | xxd -p" -- "737309740a"

您可以printf %s改用:

do shell script "printf %s " & quoted form of "ss\\tt" & "|tr \\\\ /" -- "s/t"

如果您不添加without altering line endings说明符,do shell script则将行尾转换为 CR 并从输出末尾开始换行。

于 2013-08-28T14:49:33.730 回答
0

@Lauri Ranta 的do shell script指针很有帮助,但是原始命令的一个简单变体可以解决问题:

即使do shell script调用bashassh并因此在它称为“POSIX 模式”的模式下调用,许多特定于 bash 的功能仍然可用,其中包括所谓的here-string通过标准输入将字符串直接提供给命令,例如cat <<<'Print this'

因此,通过使用一个 here-string -quoted form of从 AppleScript 传递,这始终是可取的 -echo绕过了问题:

# Sample input.
set input to "a\\\\b" # equivalent of" 'a\\b'

# Remove all `\` characters; returns 'ab'
set input to (do shell script "sed 's/\\\\//g' <<<" & quoted form of input)

替代方案,使用tr -d代替sed

 set input to (do shell script "tr -d '\\\\' <<<" & quoted form of input)
于 2014-04-02T20:34:15.210 回答