Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.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:从引用字符串块中的每个引用字符串中生成一个变量_Bash_Macos_Shell_Unix_Default - Fatal编程技术网

Bash:从引用字符串块中的每个引用字符串中生成一个变量

Bash:从引用字符串块中的每个引用字符串中生成一个变量,bash,macos,shell,unix,default,Bash,Macos,Shell,Unix,Default,我正在尝试编写一个脚本,该脚本将遍历键盘首选项窗格快捷键>服务部分中的每个服务,并禁用它 这是禁用服务的基本命令: defaults write pbs NSServicesStatus -dict-add SERVICE " <dict> <key>enabled_context_menu</key><false/> <key>enabled_services_menu</key><false/> <ke

我正在尝试编写一个脚本,该脚本将遍历
键盘首选项窗格
快捷键>服务
部分中的每个服务,并禁用它

这是禁用服务的基本命令:

defaults write pbs NSServicesStatus -dict-add SERVICE "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>
"  
这是输出:

"com.ScooterSoftware.BeyondCompare - Compare Files - bcCompareFiles" = { "com.ScooterSoftware.BeyondCompare - Compare Folders - bcCompareFolders" = { "com.ScooterSoftware.BeyondCompare - Select Left File for Compare - bcSelLeftFile" = { "com.ScooterSoftware.BeyondCompare - Select Left Folder for Compare - bcSelLeftFolder" = { "com.apple.BluetoothFileExchange - Send File To Bluetooth Device - sendFileUsingBluetoothOBEXService" = { "com.apple.ChineseTextConverterService - Convert Text from Simplified to Traditional Chinese - convertTextToTraditionalChinese" = { "com.apple.ChineseTextConverterService - Convert Text from Traditional to Simplified Chinese - convertTextToSimplifiedChinese" = { "com.apple.ChineseTextConverterService - Convert Text to Full Width - convertTextToFullWidth" = { "com.apple.ChineseTextConverterService - Convert Text to Half Width - convertTextToHalfWidth" = { "com.apple.Dictionary - Look Up in Dictionary - doLookupService" = { "com.apple.FolderActionsSetup - Folder Actions Setup - openFilesFromPasteboard" = { "com.apple.Grab - Capture Selection from Screen - variableSelection" = { "com.apple.ImageCaptureService - Import Image - ImportImage" = { "com.apple.QuickTime.service.encodeSelectedAudioFiles - Encode Selected Audio Files - runWorkflowAsService" = { "com.apple.Safari - Add to Reading List - addToReadingList" = { "com.apple.Safari - Search With %WebSearchProvider@ - searchWithWebSearchProvider" = { "com.apple.ScriptEditor2 - Script Editor/Get Result of AppleScript - runAsAppleScript" = { "com.apple.SpotlightService - SEARCH_WITH_SPOTLIGHT - doSearchWithSpotlight" = { "com.apple.Stickies - Make Sticky - makeStickyFromTextService" = { "com.apple.Terminal - New Terminal Tab at Folder - newTerminalAtFolder" = { "com.apple.Terminal - New Terminal at Folder - newTerminalAtFolder" = { "com.apple.Terminal - Open man Page in Terminal - openManPage" = { "com.apple.Terminal - Search man Page Index in Terminal - searchManPages" = { "com.apple.finder - Finder/Open - open" = { "com.apple.finder - Finder/Reveal - reveal" = { "com.apple.finder - Finder/Show Info - showInfo" = { "com.apple.mail - Mail/New Email To Address - mailTo" = { "com.apple.mail - Mail/New Email With Selection - mailSelection" = { "com.apple.services.addToiTunesAsSpokenTrack - Add to iTunes as a Spoken Track - runWorkflowAsService" = { "com.apple.services.encodeSelectedVideoFiles - Encode Selected Video Files - runWorkflowAsService" = { "com.apple.services.setDesktopPicture - Set Desktop Picture - runWorkflowAsService" = { "com.apple.services.showMap - Show Map - runWorkflowAsService" = { "com.apple.systemuiserver - Open URL - openURL" = { "com.evernote.Evernote - ENApplicationServiceMenuItemTitle - serviceCreateNote" = { "com.flexibits.cardhop.mac - Send to Cardhop - sendToCardhop" = { "com.flexibits.fantastical2.mac - Send to Fantastical 2 - sendToFantastical" = { "com.houdah.HoudahSpot4 - New HoudahSpot Search - newSearch" = { "com.houdah.HoudahSpot4 - Search Folders in HoudahSpot - folderSearch" = { "com.houdah.HoudahSpot4 - Search in HoudahSpot - search" = { "com.kapeli.dashdoc - Create Snippet in Dash - createSnippetService" = { "com.kapeli.dashdoc - Look Up in Dash - lookupService" = { "net.pornel.ImageOptim - ImageOptimize - handleServices" = { }
其中,每个带引号的字符串表示一个服务

a=$(defaults read pbs NSServicesStatus | awk 'NR%5==2' ) && echo $a
以下是我的问题:

我试图用这个
sed
命令删除所有无关的数据和空白(
=
{
}
),但无法删除单个尾随的
}

b=$(echo $a | sed -E -e 's/ = { / /g' ) && echo "${b}"
即使没有尾随的
}
(无论如何,这只会在最后一次迭代中产生错误,或者我相信是这样),在我创建的这个循环中,没有一个字符串被正确解析:

for service in "${b}"; do
defaults write pbs NSServicesStatus -dict-add "${service}" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>
"
done
似乎只有is服务被正确解析,我不知道是哪一个:

Dict {
    key_equivalent = 
    enabled_context_menu = false
    enabled_services_menu = false
}
我如何解决这个问题


谢谢大家!

我实际上不允许使用不了解结构的工具解析或生成结构化数据,但忽略了这一点--

而IFS=read-r服务;做
服务=${service%'“};服务=${service#'“}
默认写入pbs NSServicesStatus-dict添加“${service}”
已启用上下文菜单
已启用\u服务\u菜单
密钥\u等价物“”
'

完成<当我正确理解您的数据时,您可以使用

echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p'
您可以使用

echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p' |
   xargs -I xxx echo 'defaults write pbs NSServicesStatus -dict-add "xxx" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>"
'

“${b}”中服务的
;do
将不会重复多次,完整内容为
b
。顺便问一下,包含
s的文本是文字引用吗?(如果没有确切的内容,我们无法很好地测试建议的答案)。此外,请注意,您的一些代码似乎被插入“智能引用”的编辑器屏蔽了。bash只将
解析为语法;
不是语法。此外,如果使用四个空格缩进,这意味着您不需要(也不应该!)在段的开头和结尾插入回号;请确保代码块是文字(也就是说,它们完全匹配您的原始内容;没有额外的回退,没有引用类型之间的差异;等等)。也可以考虑<代码> Prtuf“A= %q\n”“$ A”/代码>而不是<代码> ECHA$< /代码>或(更好)<代码>回音”$ A“
。请参阅re:why
echo$foo
有误导性。非常感谢@Charles,您的脚本工作正常。我希望测试并查看每个服务是否正确打印,因此我尝试将
echo“${service}”
循环中,而
循环中,我得到的只是一个用引号括起来的空格,多次重复。此外:我应该如何定义
${b}
在你的脚本中?为了学习,如果你能详细说明你在回答中到底做了什么,我将不胜感激!我已经在ideone.com版本上做了引文剥离(作为问题评论中的链接添加)BTW,考虑使用“<代码>声明-P服务>代码>或<代码> Prtff '%q= %q\n'服务'$Service < < /C> >代替<代码>回声“$Service”< /C> >;<代码> Engule<代码>(请参阅应用程序用法和基本原理部分)。您好@Charles Duffy!很抱歉打断了这个老问题(再次感谢您的回答),但我只是好奇您在这里说的话:“使用不知道结构的工具解析或生成结构化数据”。如果是“不知道结构”您指的是Bash,它有无数的选项,和/或shell脚本——实现这一点的理想工具是什么?谢谢!@voronoi,…因此,首先给出一些可以在Bash脚本中使用的结构感知命令行工具的示例,
jq
知道如何处理JSON的结构,而XMLStarlet或xsltproc知道如何处理XML的结构……类似地,Python
json
lxml
库在处理这些各自的格式方面做得非常好(在较大的bash脚本中嵌入一个小的Python脚本通常是一个合理的选择).@voronoi,…请参阅最近的一个示例,其中描述了如何使用XMLStarlet编辑XML文档;您将看到操作是以引用文档语义的方式定义的(“在每个wtc服务器元素的内容末尾,添加一个wtc导入;然后,对于每个wtc服务器中的最后一个wtc导入,添加元素名称…”),而不是用于表达这些语义的特定文本。嗨@Walter,我试图测试你的答案,但无法让它工作。我应该如何在你的解决方案中声明
${b}
?它应该填充
“com.ScooterSoftware.BeyondCompare-Compare Files-bcCompareFiles”={“com…”ImageOptimize-handleServices”={}
echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p'
echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p' |
   xargs -I xxx echo 'defaults write pbs NSServicesStatus -dict-add "xxx" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>"
'
echo "$b" | tr '{' '\n' | sed -rn 's/[^"]"(.*)".*/\1/p' | 
   xargs -I xxx defaults write pbs NSServicesStatus -dict-add "xxx" "
<dict>
<key>enabled_context_menu</key><false/>
<key>enabled_services_menu</key><false/>
<key>key_equivalent</key><string>""</string>
</dict>"