And*_*yer 1 macos bash applescript sed list
这只是让我疯了.我试图用bash读取文件,删除重复项,排序,然后通过applescript显示"列表选择"窗口.
我的$ DATALOG文件的格式如下:
field1 field2
field1 field3
field1 field4
等等...
AppleScript的=awk '{print $2}' $DATALOG | awk ' !x[$0]++' | sort -u | tr "_" " "| sed 's/^/\"/' | sed 's/$/\"/' | tr "\n" "," | sed 's/.$//'
现在,这条线路很棒.在$ Applescript中,我得到这样的输出:
"场2","场3","场4"
这正是我想要的.
现在,我接受输出,并在引号和applescript部分之前添加反斜杠.
Applescript=`echo "tell application \"System Events\" to return (choose from list {$Applescript})"| sed 's/\"/\\\"/g'`
Run Code Online (Sandbox Code Playgroud)
这让我得到了我想要的东西:
告诉应用程序\"系统事件\"返回(从列表{\"字段2 \",\"字段3 \",\"字段4 \"}中选择)
现在,我尝试osascript命令:
osascript -e $ Applescript
我收到一个错误:
4:4:语法错误:预期的表达式但发现脚本结束.(-2741)
所以,我添加引号:
osascript -e"$ Applescript"
我收到一个错误:
17:18:语法错误:预期的表达式,属性或密钥形式等,但发现未知令牌.(-2741)
我不知道这里到底发生了什么,所以我决定复制$ Airport的回声并尝试将其作为一个变量.
机场=
tell application \"System Events\" to return (choose from list {\"field 2\",\"field 3\",\"field 4\"})
并且无需任何修改即可使用.
所以....
我需要弄清楚如何在不必永久设置变量的情况下执行此操作.
不要试图让它比需要的更复杂.利用shell的两个字符串引号字符组成一个shell字作为osascript -e参数的值:
Applescript=$(awk '{print $2}' $DATALOG | awk ' !x[$0]++' | sort -u | tr "_" " "| sed 's/^/\"/' | sed 's/$/\"/' | tr "\n" "," | sed 's/.$//')
osascript -e 'tell application "System Events" to return (choose from list {'"$Applescript"'})'
Run Code Online (Sandbox Code Playgroud)
此外,避免使用反引号进行命令替换是个好主意; 该$(command)是首选形式,因为它是非常容易,即使复杂的嵌套打交道时树立正确的命令.