【问题标题】:Automator replacing character with apple script or shell scriptAutomator 用苹果脚本或 shell 脚本替换字符
【发布时间】:2013-08-28 13:20:32
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: shell applescript automator


    【解决方案1】:

    试试:

    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'"
    

    【讨论】:

    • 完美,反正我更喜欢applescript。
    【解决方案2】:

    据我所知,it is no longer necessary to restore 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 script 使用/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 并从输出末尾截取一个换行符。

    【讨论】:

    • 如果 OP 有可能发布一段更大的代码,将 TID 恢复到其原始值会更安全。额外的几行代码不会增加执行时间,我相信恢复 TID 是避免较大脚本中出现问题的好习惯。
    • +1 获取do shell script 背景信息;请参阅我的答案以绕过 echo 此处字符串的问题。
    【解决方案3】:

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

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

    因此,通过使用 here-string - 与 AppleScript 中的 quoted form of 一起传递,这始终是可取的 - 绕过了 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)
    

    【讨论】:

      猜你喜欢
      • 2021-06-06
      • 2010-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-03
      • 2014-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多